Firebase:如何为密钥生成唯一的数字ID?

时间:2015-03-03 00:38:57

标签: push firebase unique identity

我需要数字ID才能实现人类可读性。如何在Firebase中获取它?

我想要键的数字ID,例如" 000000001"," 000000002"," 00000003"," 00000004"。

我需要它的原因是因为这些ID将成为在线和离线的永久对象ID。我希望用户只需输入URL" / objects / 00000001"就可以浏览该对象页面。没有努力。

我在这里问,因为我想知道是否可以在不使用.priority,子属性等的情况下完成此操作。我猜set方法可以以某种方式完成。如果不可能,请告诉我不,我可以接受这个答案。

5 个答案:

答案 0 :(得分:65)

我建议您阅读Firebase文档。具体来说,请参阅Firebase JavaScript网络指南的Saving Data部分。

来自指南:

  

获取push()

生成的唯一ID      

调用push()将返回对新数据路径的引用,您可以使用该路径获取其ID的值或将数据设置到该数据路径。以下代码将生成与上述示例相同的数据,但现在我们可以访问生成的唯一推送ID

// Generate a reference to a new location and add some data using push()
var newPostRef = postsRef.push({
  author: "gracehop",
  title: "Announcing COBOL, a New Programming Language"
});
// Get the unique ID generated by push() by accessing its key
var postID = newPostRef.key;

来源:https://www.firebase.com/docs/web/guide/saving-data.html

  • 推送生成新的数据路径,服务器时间戳为key。这些键看起来像-JiGh_31GA20JabpZBfa,因此不是数字。
  • 如果您想创建一个只有数字的ID,您可以将该参数作为对象的参数,以避免覆盖生成的密钥。
    • 密钥(新数据的路径)保证是唯一的,因此用数字密钥覆盖它们毫无意义。
    • 您可以将数字ID设置为对象的子项。
    • 然后,您可以使用Firebase Queries来查询该ID子项的对象。

来自指南:

  

在JavaScript中,调用push()然后立即调用set()的模式是如此常见,以至于我们允许您通过将要直接设置的数据传递给push()来组合它们,如下所示。以下两个写入操作都会导致将相同的数据保存到Firebase:

// These two methods are equivalent
postsRef.push().set({
  author: "gracehop",
  title: "Announcing COBOL, a New Programming Language"
});
postsRef.push({
  author: "gracehop",
  title: "Announcing COBOL, a New Programming Language"
});

来源:https://www.firebase.com/docs/web/guide/saving-data.html

答案 1 :(得分:5)

如上所述,您可以使用Firebase默认推送ID。

如果你想要一些数字,你可以根据时间戳做一些事情以避免碰撞

f.e。基于日期,小时,秒,ms和最后一些随机int的东西

01612061353136799031

转换为:

016-12-06 13:53:13:679 9031

这一切都取决于您需要的精确度(社会安全号码与日期末的一些随机字符相同)。就像白天,小时或秒钟预计会有多少交易一样。您可能希望降低精度以便于键入。

您还可以执行增加数字ID的事务,并且在成功时,您将为该用户提供唯一的连续编号。这些可以在客户端或服务器端完成。

https://firebase.google.com/docs/database/android/read-and-write

答案 2 :(得分:1)

https://firebase.google.com/docs/firestore/manage-data/transactions

使用事务并将数字保留在数据库中某个可以增加一个的位置。这样,您就可以得到一个很好的数字和简单ID。

答案 3 :(得分:1)

添加到@htafoya答案。 该代码段将是

const getTimeEpoch = () => {
    return new Date().getTime().toString();                             
}

答案 4 :(得分:0)

正如the docs所说,这可以通过使用set代替push来实现。

如文档所述,不建议这样做(由于其他用户可能在“相同”时间覆盖)。

但是在某些情况下,控制Feed的内容(包括键)会很有帮助。

作为js中的webapp的示例,193是您在其他地方生成的ID,只需:

 firebase.initializeApp(firebaseConfig);
  var data={
      "name":"Prague"
  };
  firebase.database().ref().child('areas').child("193").set(data);

这将覆盖标记为193的任何区域,或者如果尚不存在则创建一个区域。