Firebase runTransaction有时在Android上出错

时间:2019-03-25 02:09:42

标签: android firebase firebase-realtime-database

我正在使用firebase实时数据库,我创建了2个节点,一个包含一个相同项目的列表,一个仅包含列表的大小,如下所示:

+ RegResult
   + 1000
      + aaaa
      + bbbb
      // 10 item like this
   + 2000
     // 13 item
+ RegResultOnlyToTal
   + 1000 : 10
   + 2000 : 13

,当我向RegResult添加/删除项目时,我使用runTransaction来增加/减少RegResultOnlyToTal,当我测试服务器时间时,它工作得很好,但是当它变大时,我又检查了一次,这是错误的,好像RegResultOnlyToTal总是比RegResult中的实际大小小的数字。这是我的代码添加和删除项

public void addRegResult(FBRegResult fbRegResult, String key) {
    FirebaseConnection.getInstance().getDBRefRegResult().child(key).child(fbRegResult.getUsername()).setValue(fbRegResult);
    FirebaseConnection.getInstance().getDBRefRegResultOnlyToTal().child(key).runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData currentData) {
            if (currentData.getValue() == null) {
                currentData.setValue(1);
            } else {
                currentData.setValue((Long) currentData.getValue() + 1);
            }
            return Transaction.success(currentData); 
        }

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

        }
    });
}


public void removeRegResult(FBRegResult fbRegResult, final String key) {
    FirebaseConnection.getInstance().getDBRefRegResult().child(key).child(fbRegResult.getUsername()).removeValue();
    FirebaseConnection.getInstance().getDBRefRegResultOnlyToTal().child(key).runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData currentData) {
            if (currentData.getValue() == null) {
                currentData.setValue(0);
            } else {
                currentData.setValue((Long) currentData.getValue() - 1);
            }
            if ((Long) currentData.getValue() == 0) {
                currentData.setValue(null);
                return Transaction.success(currentData);
            }
            return Transaction.success(currentData); //we can also abort by calling Transaction.abort()
        }

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

        }
    });
}

有人可以告诉我我错了吗?

0 个答案:

没有答案