[英]In Firebase when using push() How do I get the unique ID and store in my database
[英]In Firebase when using push() How do I pull the unique ID
我正在尝试从 Firebase 数据库中添加/删除条目。 我想将它们列在要添加/修改/删除(前端)的表中,但我需要一种方法来唯一标识每个条目以便修改/删除。 Firebase 在使用 push() 时默认添加一个唯一标识符,但我在 API 文档中没有看到任何引用如何 select 这个唯一标识符的内容。 这甚至可以做到吗? 我应该改用 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
我如何 go 关于唯一标识第 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的方法是使用promise快照上的key
属性( 而不是方法 ):
firebase
.ref('item')
.push({...})
.then((snap) => {
const key = snap.key
})
在Firebase文档中了解有关它的更多信息。
作为旁注,那些考虑生成自己的唯一ID的人应该三思而后行。 它可能具有安全性和性能影响。 如果您不确定,请使用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
。 任何DataSnapshot上的key
属性(代表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);
});
要在push()
之后获取uniqueID
,您必须使用以下变体:
// 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;
当你push()
并使用此参考的.key
,你可以生成一个新的Ref
,你可以获得uniqueID
。
正如@Rima指出的那样, key()
是获取分配给push()
的ID firebase的最简单方法。
但是,如果你希望切断中间人,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;
};
})();
您可以更新记录使用返回的承诺添加对象ID .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})
});
我怎么做的像:
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);
现在您可以保留密钥以供进一步使用..
如果你想在写入数据库的同时或之后获取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
属性,它提供刚生成的密钥,您可以在写入数据库之前,之后或写入时使用该密钥。
使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.