IT TIP

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

itqueen 2021. 1. 5. 20:49
반응형

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


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

튜토리얼을 사용하여이 간단한 예제를 함께 작성했습니다.

<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"

스냅 샷의 "이름"(이 경우 push ()로 만든 ID)을 얻으려면 다음과 같이 name ()을 호출하면됩니다.

var name = snapshot.name();

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

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

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


이 질문을 발견 Firebase 3+하고 사용하는 사람에게 푸시 후 자동 생성 된 객체 고유 ID를 얻는 방법 은 약속 스냅 샷 에서 key속성 ( method 아님)을 사용하는 것입니다.

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

Firebase 문서 에서 자세히 알아보세요 .

참고로 자신의 고유 ID 생성을 고려하는 사람들은 이에 대해 두 번 생각해야합니다. 보안 및 성능에 영향을 미칠 수 있습니다. 확실하지 않은 경우 Firebase의 ID를 사용하세요. 타임 스탬프가 포함되어 있으며 즉시 사용할 수있는 깔끔한 보안 기능이 있습니다.

여기 에 대한 추가 정보 :

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


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가 지적했듯이 .NET Framework key()에 ID firebase를 할당하는 가장 간단한 방법입니다 push().

그러나 중개인을 잘라 내고 싶다면 Firebase는 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;
  };
})();

with .then()뒤에 반환 된 promise를 사용하여 ObjectID를 추가하는 레코드를 업데이트 할 수 있습니다 ..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})
   });

내가 어떻게했는지 :

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);

이제 나중에 사용할 수 있도록 키를 유지할 수 있습니다.


push()다른 호출을 할 필요없이 데이터베이스에 쓰는 동안 또는 이후에 firebase 메서드에 의해 생성 된 고유 키를 가져 오려면 다음 과 같이하십시오.

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)


});

The push() method has a key property which provides the key that was just generated which you can use before, after, or while you write to the database.

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

반응형