it-swarm.com.de

In Firebase bei der Verwendung von Push () Wie rufe ich die eindeutige ID ab?

Ich versuche, Einträge zu einer Firebase-Datenbank hinzuzufügen/zu entfernen. Ich möchte sie in einer Tabelle auflisten, die hinzugefügt/geändert/entfernt werden soll (Front-End), aber ich brauche eine Möglichkeit, jeden Eintrag eindeutig zu identifizieren, um ihn zu ändern/entfernen. Firebase fügt standardmäßig einen eindeutigen Bezeichner hinzu, wenn Push () verwendet wird. In der API-Dokumentation wurde jedoch nichts über die Auswahl dieses eindeutigen Bezeichners angezeigt. Kann das überhaupt gemacht werden? Soll ich stattdessen set () verwenden, um die eindeutige ID zu erstellen?

Ich habe dieses kurze Beispiel anhand des Tutorials zusammengestellt:

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

Nehmen wir nun an, ich habe drei Datenzeilen:

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

Wie gehe ich vor, um Zeile 2 eindeutig zu identifizieren?

in der Firebase-Datenbank sehen sie so aus:

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

Um den "Namen" eines Snapshots (in diesem Fall die von Push () erstellte ID) zu erhalten, rufen Sie einfach name () wie folgt auf:

var name = snapshot.name();

Wenn Sie den Namen erhalten möchten, der von Push () automatisch generiert wurde, können Sie einfach name () für die zurückgegebene Referenz aufrufen, z.

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

HINWEIS: snapshot.name() wurde nicht mehr unterstützt. Siehe andere Antworten.

40
Andrew Lee

Für jeden, der diese Frage findet und Firebase 3+ verwendet, erhalten Sie nach Push automatisch generierte eindeutige Objekt-IDs, indem Sie die key-Eigenschaft (not method) für den Promise-Schnappschuss verwenden:

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

Lesen Sie mehr darüber in den Firebase-Dokumenten .

Als Randbemerkung sollten diejenigen, die in Betracht ziehen, ihre eigene eindeutige ID zu generieren, dies zweimal überdenken. Dies kann Auswirkungen auf die Sicherheit und Leistung haben. Wenn Sie sich nicht sicher sind, verwenden Sie die Firebase-ID. Es enthält einen Zeitstempel und verfügt über einige praktische Sicherheitsfunktionen.

Mehr dazu hier :

Der von Push () generierte eindeutige Schlüssel wird nach der aktuellen Uhrzeit sortiert. Die Ergebnisliste der Elemente wird also chronologisch sortiert. Die Schlüssel sind auch so konzipiert, dass sie nicht zu erraten sind (sie enthalten 72 zufällige Entropiebits).

46
Dan Mindru

snapshot.name() wurde nicht mehr unterstützt. Verwenden Sie stattdessen key. Die key -Eigenschaft für ein beliebiges DataSnapshot (außer eines, das den Stamm einer Firebase darstellt) gibt den Schlüsselnamen des Speicherorts zurück, von dem er generiert wurde. In deinem Beispiel:

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);
});
32
Rima

Um uniqueID nach Push() zu bekommen, müssen Sie diese Variante verwenden:

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

Sie erzeugen eine neue Ref, wenn Sie Push() und mit .key dieses Ref. uniqueID erhalten.

6
Denis Markov

Wie @Rima hervorgehoben hat, ist key() die einfachste Möglichkeit, die ID-Firebase Ihrer Push() zuzuweisen.

Wenn Sie jedoch den mittleren Mann ausschalten möchten, hat Firebase eine Gist mit ihrem ID-Generierungscode veröffentlicht. Es ist einfach eine Funktion der aktuellen Zeit, und so garantieren sie die Einzigartigkeit, auch ohne Kommunikation mit dem Server.

Damit können Sie generateId(obj) und set(obj) verwenden, um die Funktionalität von Push() zu replizieren.

Hier ist die ID-Funktion :

/**
 * 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;
  };
})();
3
Brandon

Sie können den Datensatz aktualisieren, indem Sie die ObjectID mit einem Versprechen hinzufügen, das von .then() nach der .Push() mit snapshot.key zurückgegeben wird:

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

Wie ich es gemacht habe:

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

Jetzt können Sie den Schlüssel für die weitere Verwendung aufbewahren.

0
Deepesh

Wenn Sie den von der firebase Push() -Methode generierten eindeutigen Schlüssel während oder nach dem Schreiben in die Datenbank abrufen möchten, ohne einen weiteren Aufruf durchführen zu müssen, gehen Sie wie folgt vor:

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)


});

Die Methode Push() verfügt über die Eigenschaft key, die den soeben generierten Schlüssel bereitstellt, den Sie vor, nach oder während des Schreibens in die Datenbank verwenden können.

0