使用生成的密钥插入 Firebase

Posted

技术标签:

【中文标题】使用生成的密钥插入 Firebase【英文标题】:Firebase insert with generated key 【发布时间】:2017-07-12 08:03:32 【问题描述】:

我在 firebase 中有一个 root,就像我试图让用户删除列表中的项目一样。但用户可以放弃他的决定。当用户放弃这个决定时,我想在数据库中再次插入已删除的项目。但是,我想插入旧的 firebase 生成的密钥,因为我使用的是 firebase 按键。这是一个不好的做法。 firebase 如何生成这些密钥?它会检查 db 上的每个键并生成一个新键吗?是否有任何可能性,该密钥被标记为已删除并稍后为另一个项目生成?对不起语言。很难表达。

已编辑:我想使用旧密钥,因为我使用 orderByKey 获取数据。我不想失去秩序。

【问题讨论】:

【参考方案1】:

firebase 如何生成这些密钥?它会检查 db 上的每个键并生成一个新键吗?

每当您在数据库引用上使用push 时,都会使用包含服务器时间戳的唯一键生成一个新数据节点。这些键看起来像 -KiGh_31GA20KabpZBfa

由于时间戳,您可以确保给定的键是唯一的,而无需检查数据库中的其他键。

是否有可能,该密钥被标记为已删除并稍后为另一个项目生成?

不,无论一个是否被移除,两个键都不可能发生冲突。

但是,我想插入旧的 firebase 生成的密钥,因为我使用的是 firebase 按键。这是一个坏习惯吗

很遗憾,您不能仅使用push 两次生成相同的密钥。因此,不可能删除具有给定键的节点,然后使用push 将其再次插入到具有相同键的相同路径中,因为push 会生成一个不同且唯一的键。

如果不是这样,如果按键排序对您来说很重要,并且有可能重新插入已删除的节点,那么我建议您执行以下操作之一:-

    从数据库中删除密钥时将其保存在客户端,并在需要重新插入时使用。

    或者,也许,在您的数据库中有一个“已删除密钥”路径并将已删除的密钥保存在那里。当然,使用这种方法,您需要存储额外的信息来识别密钥对应的数据。

这完全取决于您的用例。

【讨论】:

感谢您的出色回答。我已经知道那些物品的钥匙。我在获取数据时正在映射它们。所以,我知道删除的密钥,我可以再次插入它。我真的明白firebase键的想法。谢谢你。 :) 太棒了!很高兴我能帮忙:)【参考方案2】:

调用 push() 将为您生成一个密钥。

如果您改为使用 child(),您可以自己确定它们的键/路径。

ref.child("yourvalue").setValue("setting custom key when pushing new data to firebase database");

https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html

【讨论】:

我知道,但我想使用旧密钥。因为我不想失去秩序。我正在使用 orderByKey() 获取数据。将旧密钥用作新密钥是否会对未来造成任何损害? 你可以从你的请求中获取旧的旧密钥,然后在此处设置它会完成这项工作 我知道它会完成这项工作。我只是想知道,这样用手用起来很危险。 我认为这不是问题,因为 Firebase 键是部分时间戳和部分随机字符,因此两个键相同非常不合适。更新了 ans 中的博客链接

以上是关于使用生成的密钥插入 Firebase的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis,如何获取插入的自动生成密钥? [MySql]

jdbc 有效地获取生成的密钥以及其他数据

Spring JdbcTemplate - 插入 blob 并返回生成的密钥

在 spring 3 / PostgreSQL 8.4.9 中从行插入中获取自动生成的密钥

Sybase JDBC 获取生成的密钥

第151天:网页中插入百度地图方法(不需要密钥)