2013-05-19 8 views
42

Próbuję dodać/usunąć wpisy z bazy danych Firebase. Chcę je wymienić w tabeli do dodania/modyfikacji/usunięcia (front end), ale potrzebuję sposobu na jednoznaczną identyfikację każdego wpisu w celu modyfikacji/usunięcia. Firebase dodaje domyślnie unikalny identyfikator podczas korzystania z funkcji push(), ale nie widziałem żadnego odniesienia do tego, jak wybrać ten unikalny identyfikator w dokumentacji interfejsu API. Czy można to nawet zrobić? Czy zamiast tego powinienem używać set(), więc tworzę unikalny identyfikator?W Firebase przy użyciu funkcji push() Jak pobrać unikatowy identyfikator

Włożyłam ten krótki przykład razem używając ich samouczka:

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

Teraz pozwala zakładać, mam trzy rzędy danych:

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

Jak mogę iść o jednoznacznej identyfikacji Row 2?

w Bazie Firebase one wyglądać tak:

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

Odpowiedz

40

Aby uzyskać „imię” jakiegokolwiek migawki (w tym przypadku, ID stworzony przez push()) wystarczy zadzwonić nazwy() jak poniżej:

var name = snapshot.name(); 

Jeśli chcesz uzyskać nazwę, która została automatycznie wygenerowana przez push(), można po prostu zadzwonić do nazwy() na zwróconej odniesienia, tak jak poniżej:

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

UWAGA: snapshot.name() jest przestarzałe. Zobacz inne odpowiedzi.

+0

Zrobiłem coś, po prostu nie jestem pewien co ... Zwraca wartości, które wyglądają jak unikalne identyfikatory, ale są różne za każdym razem, gdy odświeżam stronę. Jako przykład -Iuy2dANtFBZ-OK7I-XK stanie się -Iuy2dAPFfOkgSy7bLFo następnie -Iuy2dAPFfOkgSy7bLFp. zmienia każdą linię za każdym razem, gdy odświeżam stronę. –

+0

Nadal nie jestem pewien, dlaczego, ale coś w twoim przykładzie wygenerowało nowe nieprawidłowe klucze za każdym razem. Po pewnym kopaniu użyłem var message = snapshot.val(); message.id = snapshot.name() ;. Zaprowadziłeś mnie tam, jeśli chcesz zaktualizować swoją odpowiedź lub opracować, co mogło pójść nie tak, chętnie przyjmę twoją odpowiedź. –

+0

Myślał, że chcesz uzyskać nazwę referencji, gdy naciskasz nowy czat (np. Naciśnięcie klawisza), w przeciwieństwie do ładowania wczytanych wcześniej czatów. Czy to ma sens? – bennlich

32

snapshot.name() jest przestarzałe. zamiast tego użyj key. Właściwość key na dowolnym DataSnapshot (z wyjątkiem tego, który reprezentuje katalog główny Bazy Firebase) zwróci kluczową nazwę lokalizacji, która go wygenerowała. W przykładzie:

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); 
}); 
+5

Należy zauważyć, że 'klucz' jest teraz właściwością, a nie metodą na DataSnapshot: https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#key – imjared

+0

@Andrew Lee. Po prostu ciekawy, jako gość, który zadał oryginalne pytanie. Czy zmiana akceptowanej odpowiedzi jest złym rozwiązaniem, jeśli wcześniej zaakceptowana odpowiedź została zamortyzowana? Co to jest etykieta wymiany stosu? –

+0

@Front_end_Dev Zapytaj na stackoverflow meta –

3

Jak @Rima wskazał, key() jest najprostszym sposobem na uzyskanie Firebase identyfikacyjny przypisany do push().

Jeśli jednak chcesz wykluczyć pośrednika, Firebase wydało istotę z kodem generującym identyfikator. Jest to po prostu funkcja bieżącego czasu, co gwarantuje wyjątkowość, a nawet brak komunikacji z serwerem.

Z tym, można użyć generateId(obj) i set(obj) do odtworzenia funkcjonalności push()

Here's the ID function:

/** 
* 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 = '-ABCDEFGHIJKLMNOPQRSTUVWXYZ_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; 
    }; 
})(); 
24

każdemu znalezienie na to pytanie & użyciu Firebase 3+, aż pojawi się automatycznie wygenerowany obiekt unikalne identyfikatory po naciśnięciu jest używana właściwość key (nie metoda) na obiecującej migawce:

Dowiedz się więcej o tym w

Na marginesie te, które rozważają wygenerowanie własnego unikalnego identyfikatora, powinny dwa razy pomyśleć o tym. Może mieć wpływ na bezpieczeństwo i wydajność. Jeśli nie masz pewności, użyj identyfikatora Firebase. Zawiera sygnaturę czasową i posiada kilka zgrabnych funkcji bezpieczeństwa po wyjęciu z pudełka.

Więcej o tym here:

Unikatowy klucz generowany przez push() są sortowane według aktualnego czasu, więc uzyskany lista elementów zostaną posortowane chronologicznie. Klawisze są również zaprojektowane tak, aby były nieczytelne (zawierają 72 losowe bity entropii).

+2

najlepsze rozwiązanie zdecydowanie, dzięki –

0

jak to zrobiłem jak:

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

Teraz można zachować klucz do dalszego użytku ..

+0

To jest Java, podczas gdy kod OP jest Javascript/www. – Venryx

1

Aby uzyskać uniqueID po push() należy użyć tego wariantu:

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

Generujesz nowy Ref, gdy push() i za pomocą .key tego ref. Możesz uzyskać uniqueID.