【问题标题】:Flutter Firebase Realtime Database write/update to multiple nodes at onceFlutter Firebase 实时数据库一次写入/更新到多个节点
【发布时间】:2021-12-06 07:35:02
【问题描述】:

我使用 Firebase 作为我的 Flutter 项目的后端。我需要在一个事务中写入多个节点。现在我有:

await (_firebaseDatabase
        .reference()
        .child('user_data').Push().set({"userName":"aaa"}));
await (_firebaseDatabase
        .reference()
        .child('user_history').Push().set({"userName":"aaa"}));

但是这些是 2 个transactions,所以 1 可能会成功结束,但另一个可能会失败,我想防止这种情况发生。

另一种情况是写信到user_data 并更新到user_history。我们如何在 firebase 实时数据库中实现这一点?

基本上,我想在单个事务中在 2 个不同的节点上进行插入和更新,以免数据不匹配。

【问题讨论】:

    标签: firebase dart firebase-realtime-database batch-processing


    【解决方案1】:

    您要查找的内容称为多路径写入操作,它允许您通过单个 update 调用写入多个不重叠的路径。您可以为每个键指定要更新的完整路径,然后数据库将在该特定路径设置您指定的值。

    要生成两个单独的唯一键,您可以调用 push() 两次,无需任何参数。当这样调用时,它实际上并不写入数据库,而只是生成一个唯一的参考客户端,然后您可以从中获取密钥。

    结合起来,它看起来像这样:

    const db = _firebaseDatabase.reference();
    const key1 = db.push().key;
    const key2 = db.push().key;
    const values = {};
    values["user_data/"+key1+"/username"] = "aaa";
    values["user_history/"+key2+"/username"] = "aaa";
    db.update(values);
    

    【讨论】:

    • 感谢我一直在寻找的东西。
    • 另外,你能解释一下runTransaction方法吗?可以在我的情况下使用吗?
    • 事务在树的单个分支上运行。在您的情况下,这将是 /user_data/user_history 的共同祖先,即整个数据库。即使用户已经很少,这也可能导致争用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2021-10-19
    • 2021-07-03
    • 2021-01-31
    • 2020-08-05
    • 2021-10-13
    相关资源
    最近更新 更多