Java 如何将子项添加到Firebase数据库中,使其密钥随每个子项的添加而递增?

Java 如何将子项添加到Firebase数据库中,使其密钥随每个子项的添加而递增?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我相信在没有任何副本的情况下,正确的方法是使用事务,但是出于某种原因,函数中传递的MutableData对象不会返回任何子对象,尽管我向Firebase数据库添加了一些虚拟数据以进行测试。谁能给我指出正确的方向吗?干杯 以下是相关代码: 数据库: games/ 0/ ... 1/ ... 交易: private void startNewGame(DatabaseReference _DatabaseRef) { _DatabaseRef

我相信在没有任何副本的情况下,正确的方法是使用事务,但是出于某种原因,函数中传递的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记录为子计数,尽管我添加了两个键为0和1的子计数。真正奇怪的是,如果我试图明确地得到一个孩子,它会起作用

mutableData.child("1");
实际返回包含所有数据的正确子级


非常感谢您的帮助。

有关详细信息,请阅读文档。特别是本节末尾的注释:

注意:由于doTransaction被多次调用,因此必须 能够处理空数据。即使您的数据库中存在现有数据 远程数据库,当事务发生时,它可能不会在本地缓存 函数运行,导致初始值为null

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

从事务处理程序返回null可能会中止事务,这样就不会再次调用它。而是返回一个与您最初收到的数据相同的

databaseReference.child("JsonArrayNode").setValue(value1);
databaseReference.child("JsonArrayNode").setValue(value2);
.....
databaseReference.child("JsonArrayNode").setValue(valueN);
默认情况下,Firebase会指定0、1、2、,N值1、值2的索引。。。瓦伦。这意味着键会自动递增


如果多个设备同时写入相同的JsonArrayNode,则并发事务可能会损坏数据。仅在本例中,您调用事务,因为在事务上您有CallbackOnComplete,这让您知道事务是否成功?如果没有,请再次重复修改

我不明白你想解释什么。你想在这里实现什么?啊,这很有道理。我完全误解了交易的工作原理,谢谢你的帮助!