【问题标题】:How to add child to Firebase database with key that increments with every child added?如何将孩子添加到 Firebase 数据库,其密钥随着每个孩子的添加而递增?
【发布时间】:2017-08-13 04:58:43
【问题描述】:

我相信在没有任何重复的情况下执行此操作的正确方法是使用事务,但是由于某种原因,函数中传递的 MutableData 对象不会返回任何子对象,尽管我向 Firebase 添加了一些虚拟数据用于测试的数据库。谁能指出我正确的方向?干杯!

以下是相关代码:

数据库:

games/
    0/
        ...
    1/
        ...

交易:

private void startNewGame(DatabaseReference _DatabaseRef) {
    _DatabaseRef.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData mutableData) {
            Log.v("CUSTOMDEBUG", Long.toString(mutableData.getChildrenCount()));
            return null;
        }

        @Override
        public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {

        }
    });
}

由于某种原因,上面的代码将 0 记录为子计数,尽管我添加了 2 个具有键“0”和“1”的子。真正奇怪的是,如果我试图明确地得到一个孩子,它会起作用!

mutableData.child("1");

实际上返回所有数据的正确孩子!

感谢任何帮助。

【问题讨论】:

  • 我不明白你要解释什么。您想在这里实现什么目标?

标签: java android firebase firebase-realtime-database


【解决方案1】:

请阅读transactions 的文档。特别是本节末尾的注释:

注意:因为doTransaction()被多次调用,所以必须是 能够处理空数据。即使您的数据中存在现有数据 远程数据库,事务时可能没有本地缓存 函数运行,导致初始值为 null。

您的事务处理程序首先收到一个空值。您需要通过返回一个成功的交易指示来检测并处理它。如果该位置确实有数据,则会使用该数据再次调用它,如果与那里写入的其他客户端发生冲突,可能会调用更多次。

从您的事务处理程序返回 null 可能会中止事务,以便它不会再次被调用。而是返回一个success indicator,其中包含您最初收到的相同数据。

【讨论】:

  • 啊,有道理。我完全误解了交易是如何运作的,谢谢你的帮助!
【解决方案2】:
databaseReference.child("JsonArrayNode").setValue(value1);
databaseReference.child("JsonArrayNode").setValue(value2);
.....
databaseReference.child("JsonArrayNode").setValue(valueN);

默认情况下,Firebase 为 value1、value2、... valueN 分配 0、1、2、...、N 索引。这意味着密钥自动递增。

如果多个设备同时写入同一个 JsonArrayNode,则数据可能会被并发事务损坏。仅在这种情况下,您调用transactions,因为在事务上您有回调onComplete(),它可以让您知道事务是否成功?如果没有,您再次重复修改。

【讨论】:

    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2015-09-30
    • 2017-02-22
    • 2012-08-01
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多