在Firebase中,当使用push()方法时,我如何获取唯一的ID?

7 浏览
0 Comments

在Firebase中,当使用push()方法时,我如何获取唯一的ID?

我试图向Firebase数据库中添加/删除条目。我想要在表格中列出它们以进行添加/修改/删除(前端),但我需要一种方法来唯一标识每个条目以便进行修改/删除。当使用push()时,Firebase默认添加一个唯一标识符,但我没有在API文档中找到如何选择这个唯一标识符的任何相关信息。这个能做到吗?我应该使用set()来创建唯一ID吗?

我使用他们的教程编写了这个快速示例:








现在假设我有三行数据:

fred : 1 : 1 : 1 : 测试消息1
fred : 1 : 1 : 1 : 测试消息2
fred : 1 : 1 : 1 : 测试消息3

我该如何唯一标识第二行数据?

在Firebase数据库中,它们看起来像这样:

-DatabaseName

-IuxeSuSiNy6xiahCXa0

approved: "1"

category: "1"

enabled: "1"

name: "Fred"

text: "测试消息1"

-IuxeTjwWOhV0lyEP5hf

approved: "1"

category: "1"

enabled: "1"

name: "Fred"

text: "测试消息2"

-IuxeUWgBMTH4Xk9QADM

approved: "1"

category: "1"

enabled: "1"

name: "Fred"

text: "测试消息3"

0
0 Comments

在Firebase中,使用push()方法生成的数据节点会自动生成一个唯一的ID。但是,在最新的版本中,使用snapshot.name()方法来获取这个唯一ID的方式已经被废弃了。取而代之的是使用snapshot.key属性来获取唯一ID的名称。

解决方法是,在child_added事件的回调函数中,使用snapshot.key属性来获取唯一ID的名称,并将其存储到变量id中。然后,可以根据需要在代码中使用这个唯一ID。

以下是示例代码:

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

需要注意的是,现在key属性是一个属性,而不是DataSnapshot的一个方法。更多关于key属性的信息可以参考Firebase官方文档:firebase.google.com/docs/reference/js/…

至于在Stack Exchange上更改接受的答案是否被认为是不好的行为,目前我所知道的是没有问题的。可以根据实际情况更改接受的答案。

0
0 Comments

在Firebase中,使用push()方法创建一个新的数据节点时,会自动生成一个唯一的ID作为该节点的名称。有时候我们需要获取这个ID,下面是一种方法:

通过调用name()方法来获取任何快照(snapshot)的名称(在这个例子中,就是push()方法生成的ID):

var name = snapshot.name();

如果想要获取由push()方法自动生成的名称,可以在返回的引用上调用name()方法,像这样:

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

var newID = newRef.name();

注意:snapshot.name()方法已经被弃用,可以参考其他答案。

有一个用户尝试使用上述方法获取ID,但每次刷新页面时,返回的ID都不同。经过一番研究后,他发现可以通过var message = snapshot.val(); message.id = snapshot.name();来获取ID。他认为这个问题发生的原因是,之前的示例代码是在推送新的聊天消息时获取名称,而不是在加载之前保存的聊天消息时获取名称。

另外,有一个用户提到他看到Firebase会根据需要自动生成键,但也可以创建自己的自定义递增快照键。他想知道如何创建自定义的递增快照键。

对于这个问题,有一个用户回答称他会生成自己的递增键,并将最后一个键存储在一个配置对象中,以便跟踪。然后,另一个用户询问如何设置递增键。

还有一个用户提到,由于代码是异步的,所以在后端完成之前,如何获取自动生成的ID。

总结一下,通过调用snapshot.name()方法可以获取自动生成的唯一ID。如果想要在推送数据时获取ID,可以在返回的引用上调用name()方法。另外,也可以自己生成递增的键,并将最后一个键存储起来。至于如何在异步代码中获取自动生成的ID,目前还没有给出具体的解决方法。

0
0 Comments

在使用Firebase的push()时,如何获取唯一ID?

问题原因:在Firebase 3+版本中,使用push()方法后,想要获取自动生成的唯一ID的方式是使用promise snapshot上的key属性,而不是使用方法。

解决方法:

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

更多关于此方法的信息可以在Firebase文档中了解:Firebase文档

另外,那些考虑生成自己的唯一ID的人应该三思而后行。这可能会带来安全和性能方面的影响。如果不确定,建议使用Firebase的ID。它包含了时间戳并具有一些很好的安全功能。

关于此功能的更多信息可以在此处了解:

The unique key generated by push() are ordered by the current time, so the resulting list of items will be chronologically sorted. The keys are also designed to be unguessable (they contain 72 random bits of entropy).

非常感谢你,你不知道在我找到你简单的答案之前我有多么痛苦。

这个方法可行,被接受的答案必须使用这个方法替换。

0