В Firebase при использовании push() Как я могу потянуть уникальный идентификатор
Я пытаюсь добавить/удалить записи из базы данных Firebase. Я хочу перечислить их в таблице, которая будет добавлена /изменена/удалена (передняя часть), но мне нужен способ однозначно идентифицировать каждую запись для изменения/удаления. Firebase добавляет уникальный идентификатор по умолчанию при использовании push(), но я ничего не видел, ссылаясь на то, как выбрать этот уникальный идентификатор в документации API. Можно ли это сделать? Должен ли я использовать 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"
Ответы
Ответ 1
Чтобы получить "имя" любого моментального снимка (в этом случае идентификатор, созданный push()), просто вызовите имя() следующим образом:
var name = snapshot.name();
Если вы хотите получить имя, которое было автоматически сгенерировано с помощью push(), вы можете просто вызвать имя() в возвращаемой ссылке, например:
var newRef = myDataRef.push(...);
var newID = newRef.name();
Примечание:
snapshot.name()
устарел. См. Другие ответы.
Ответ 2
Чтобы кто-нибудь нашел этот вопрос и использовал Firebase 3+
, способ, которым вы получаете уникальные идентификаторы автоматически генерируемых объектов после нажатия, заключается в использовании свойства key
(не метода) на снимке обещаний:
firebase
.ref('item')
.push({...})
.then((snap) => {
const key = snap.key
})
Подробнее об этом читайте в Документах Firebase.
В качестве побочного примечания те, кто считает, что генерируют свой собственный уникальный идентификатор, должны дважды подумать об этом. Это может иметь последствия для безопасности и производительности. Если вы не уверены в этом, используйте Firebase ID. Он содержит временную метку и имеет некоторые аккуратные функции безопасности из коробки.
Подробнее об этом здесь:
Уникальный ключ, сгенерированный push(), упорядочивается по текущему времени, поэтому результирующий список элементов будет хронологически отсортирован. Клавиши также предназначены для того, чтобы быть неопровержимыми (они содержат 72 случайных бита энтропии).
Ответ 3
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);
});
Ответ 4
Чтобы получить 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
этого ref, вы можете получить uniqueID
.
Ответ 5
Как отмечал @Rima, key()
- самый простой способ получить идентификационную firebase, назначенную вашему push()
.
Если, однако, вы хотите вырезать среднего человека, Firebase выпустила суть с кодом генерации ID. Это просто функция текущего времени, так как они гарантируют уникальность, даже без связи с сервером.
С этим вы можете использовать generateId(obj)
и set(obj)
для репликации функций push()
Здесь функция идентификатора:
/**
* 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;
};
})();
Ответ 6
Вы можете обновить запись, добавив ObjectID, используя обещание, возвращаемое .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})
});
Ответ 7
Как мне это понравилось:
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);
Теперь вы можете сохранить ключ для дальнейшего использования.
Ответ 8
Если вы хотите получить уникальный ключ, сгенерированный методом firebase 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
которое предоставляет только что сгенерированный ключ, который вы можете использовать до, после или во время записи в базу данных.