programing

Firebase에서 push()를 사용할 때 고유 ID를 가져오는 방법

yellowcard 2023. 6. 29. 19:56
반응형

Firebase에서 push()를 사용할 때 고유 ID를 가져오는 방법

Firebase 데이터베이스에서 항목을 추가/제거하려고 합니다.추가/수정/제거(프론트 엔드)할 테이블에 목록을 표시하고 싶지만, 수정/제거를 위해 각 항목을 고유하게 식별할 수 있는 방법이 필요합니다.Firebase는 push()를 사용할 때 기본적으로 고유 식별자를 추가하지만 API 설명서에서 이 고유 식별자를 선택하는 방법을 참조하는 내용을 보지 못했습니다.이게 가능할까요?고유 ID를 만들기 위해 set()을 대신 사용해야 합니까?

이들의 튜토리얼을 사용하여 다음과 같은 간단한 예를 정리했습니다.

<div id='messagesDiv'></div>
<input type='text' class="td-field" id='nameInput' placeholder='Name'>
<input type='text' class="td-field" id='messageInput' placeholder='Message'>
<input type='text' class="td-field" id='categoryInput' placeholder='Category'>
<input type='text' class="td-field" id='enabledInput' placeholder='Enabled'>
<input type='text' class="td-field" id='approvedInput' placeholder='Approved'>
<input type='Button' class="td-field" id='Submit' Value="Revove" onclick="msgRef.remove()">

<script>
var myDataRef = new Firebase('https://unique.firebase.com/');

  $('.td-field').keypress(function (e) {
    if (e.keyCode == 13) {
      var name     = $('#nameInput').val();
      var text     = $('#messageInput').val();
      var category = $('#categoryInput').val();
      var enabled  = $('#enabledInput').val();
      var approved = $('#approvedInput').val();
      myDataRef.push({name: name, text: text, category: category, enabled: enabled, approved: approved });
      $('#messageInput').val('');
    }
  });
  myDataRef.on('child_added', function(snapshot) {
    var message = snapshot.val();
    displayChatMessage(message.name, message.text, message.category, message.enabled, message.approved);
  });
  function displayChatMessage(name, text, category, enabled, approved, ) {
    $('<div/>').text(text).prepend($('<em/>').text(name+' : '+category +' : '+enabled +' : '+approved+ ' : ' )).appendTo($('#messagesDiv'));
    $('#messagesDiv')[0].scrollTop = $('#messagesDiv')[0].scrollHeight;
  };
</script>

이제 세 줄의 데이터가 있다고 가정하겠습니다.

fred : 1 : 1 : 1 : test message 1
fred : 1 : 1 : 1 : test message 2
fred : 1 : 1 : 1 : test message 3

2열을 고유하게 식별하려면 어떻게 해야 합니까?

Firebase 데이터베이스에서는 다음과 같이 표시됩니다.

-DatabaseName
    -IuxeSuSiNy6xiahCXa0
        approved: "1"
        category: "1"
        enabled: "1"
        name: "Fred"
        text: "test message 1"
    -IuxeTjwWOhV0lyEP5hf
        approved: "1"
        category: "1"
        enabled: "1"
        name: "Fred"
        text: "test message 2"
    -IuxeUWgBMTH4Xk9QADM
        approved: "1"
        category: "1"
        enabled: "1"
        name: "Fred"
        text: "test message 3"

이 질문을 찾고 사용하는 모든 사람에게Firebase 3+푸시 후 자동 생성된 개체 고유 ID를 얻는 방법은key약속 스냅샷의 속성(메소드가 아님):

firebase
  .ref('item')
  .push({...})
  .then((snap) => {
     const key = snap.key 
  })

자세한 내용은 Firebase 문서를 참조하십시오.

참고로, 자신만의 고유한 ID를 생성하는 것을 고려하는 사람들은 그것에 대해 다시 생각해야 합니다.보안 및 성능에 영향을 미칠 수 있습니다.잘 모르겠으면 파이어베이스의 아이디를 사용하세요.타임스탬프가 포함되어 있으며 기본 제공되는 몇 가지 깔끔한 보안 기능이 있습니다.

자세한 내용은 여기에서 확인하십시오.

push()에 의해 생성된 고유 키는 현재 시간순으로 정렬되므로 결과 항목 목록이 시간순으로 정렬됩니다.또한 키는 추측할 수 없도록 설계되었습니다(엔트로피의 72개 랜덤 비트 포함).

스냅샷의 "이름"(이 경우 push()로 생성된 ID)를 가져오려면 다음과 같이 name()을 호출합니다.

var name = snapshot.name();

push()에 의해 자동 생성된 이름을 가져오려면 반환된 참조에서 다음과 같이 name()을 호출하면 됩니다.

var newRef = myDataRef.push(...);
var newID = newRef.name();

참고: snapshot.name()더 이상 사용되지 않습니다.다른 답변을 참조하십시오.

snapshot.name()더 이상 사용되지 않습니다.사용하다key대신.key모든 DataSnapshot의 속성(Firebase의 루트를 나타내는 속성 제외)은 해당 속성을 생성한 위치의 키 이름을 반환합니다.예를 들어, 다음과 같습니다.

myDataRef.on('child_added', function(snapshot) {
    var message = snapshot.val();
    var id = snapshot.key;
    displayChatMessage(message.name, message.text, message.category, message.enabled, message.approved);
});

갖기 위해uniqueID끝나고push()다음 변형을 사용해야 합니다.

// Generate a reference to a new location and add some data using push()
 var newPostRef = postsRef.push();
// Get the unique key generated by push()
var postId = newPostRef.key;

새 항목을 생성합니다.Ref너가 언제push()및 사용.key당신이 얻을 수 있는 이 심판의.uniqueID.

@ @Rima ,key()는 사용자의 가방간법은한 ID 것기할는입다니당하을반벽방화에 입니다.push().

그러나 중간자를 배제하고 싶다면 파이어베이스는 ID 생성 코드가 포함된 요지를 공개했습니다.이는 단순히 현재 시간의 기능으로, 서버와 통신하지 않고도 고유성을 보장하는 방식입니다.

, 당은을 사용할 수 있습니다.generateId(obj)그리고.set(obj)의 합니다.push()

ID 기능은 다음과 같습니다.

/**
 * Fancy ID generator that creates 20-character string identifiers with the following properties:
 *
 * 1. They're based on timestamp so that they sort *after* any existing ids.
 * 2. They contain 72-bits of random data after the timestamp so that IDs won't collide with other clients' IDs.
 * 3. They sort *lexicographically* (so the timestamp is converted to characters that will sort properly).
 * 4. They're monotonically increasing.  Even if you generate more than one in the same timestamp, the
 *    latter ones will sort after the former ones.  We do this by using the previous random bits
 *    but "incrementing" them by 1 (only in the case of a timestamp collision).
 */
generatePushID = (function() {
  // Modeled after base64 web-safe chars, but ordered by ASCII.
  var PUSH_CHARS = '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';

  // Timestamp of last push, used to prevent local collisions if you push twice in one ms.
  var lastPushTime = 0;

  // We generate 72-bits of randomness which get turned into 12 characters and appended to the
  // timestamp to prevent collisions with other clients.  We store the last characters we
  // generated because in the event of a collision, we'll use those same characters except
  // "incremented" by one.
  var lastRandChars = [];

  return function() {
    var now = new Date().getTime();
    var duplicateTime = (now === lastPushTime);
    lastPushTime = now;

    var timeStampChars = new Array(8);
    for (var i = 7; i >= 0; i--) {
      timeStampChars[i] = PUSH_CHARS.charAt(now % 64);
      // NOTE: Can't use << here because javascript will convert to int and lose the upper bits.
      now = Math.floor(now / 64);
    }
    if (now !== 0) throw new Error('We should have converted the entire timestamp.');

    var id = timeStampChars.join('');

    if (!duplicateTime) {
      for (i = 0; i < 12; i++) {
        lastRandChars[i] = Math.floor(Math.random() * 64);
      }
    } else {
      // If the timestamp hasn't changed since last push, use the same random number, except incremented by 1.
      for (i = 11; i >= 0 && lastRandChars[i] === 63; i--) {
        lastRandChars[i] = 0;
      }
      lastRandChars[i]++;
    }
    for (i = 0; i < 12; i++) {
      id += PUSH_CHARS.charAt(lastRandChars[i]);
    }
    if(id.length != 20) throw new Error('Length should be 20.');

    return id;
  };
})();

Object를 반환객된사용하는약속다니.하여 할 수 ..then().push()와 함께snapshot.key:

const ref = Firebase.database().ref(`/posts`);
ref.push({ title, categories, content, timestamp})
   .then((snapshot) => {
     ref.child(snapshot.key).update({"id": snapshot.key})
   });

파이어베이스에서 생성된 고유 키를 가져오려면push()다른 전화를 걸 필요 없이 데이터베이스에 글을 쓰는 동안 또는 쓴 후 방법은 다음과 같습니다.

var reference = firebaseDatabase.ref('your/reference').push()

var uniqueKey = reference.key

reference.set("helllooooo")
.then(() => {

console.log(uniqueKey)



// this uniqueKey will be the same key that was just add/saved to your database



// can check your local console and your database, you will see the same key in both firebase and your local console


})
.catch(err =>

console.log(err)


});

push()에 메드가 .key데이터베이스에 쓰기 전, 후 또는 쓰는 동안 사용할 수 있는 방금 생성된 키를 제공하는 속성입니다.

사용하다push()새로운 레퍼런스를 얻기 위해 그리고key고유한 ID를 얻을 수 있습니다.

var ref = FirebaseDatabase.instance.ref(); 
var newRef = ref.push(); // Get new key
print(newRef.key); // This is the new key i.e IqpDfbI8f7EXABCma1t
newRef.set({"Demo": "Data"}) // Will be set under the above key

내가 어떻게 했냐면:

FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference ref = mFirebaseDatabase.getReference().child("users").child(uid); 

String key = ref.push().getKey(); // this will fetch unique key in advance
ref.child(key).setValue(classObject);

이제 추가로 사용할 수 있도록 키를 보관할 수 있습니다.

언급URL : https://stackoverflow.com/questions/16637035/in-firebase-when-using-push-how-do-i-pull-the-unique-id

반응형