Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase-事务加载所有数据_Android_Firebase_Transactions_Firebase Realtime Database - Fatal编程技术网

Android Firebase-事务加载所有数据

Android Firebase-事务加载所有数据,android,firebase,transactions,firebase-realtime-database,Android,Firebase,Transactions,Firebase Realtime Database,我在firebase事务中注意到一些东西。我想知道是否有什么办法 为了解释我的问题,我做了一个小测试。我的实时数据库中有这些数据 test nbElement : 4 list "1" : value1 "2" : value2 "3" : value3 "4" : value4 换句话说,我有一个字符串数组和一个计数器。每次在数组中添加值时,我都要增加计数器。用户通常会在数组中添加一个值,数组可以是“大的”。用户

我在firebase事务中注意到一些东西。我想知道是否有什么办法

为了解释我的问题,我做了一个小测试。我的实时数据库中有这些数据

test
    nbElement : 4
    list
        "1" : value1
        "2" : value2
        "3" : value3
        "4" : value4
换句话说,我有一个字符串数组和一个计数器。每次在数组中添加值时,我都要增加计数器。用户通常会在数组中添加一个值,数组可以是“大的”。用户将经常检查数组中的nbElement,但很少读取数组中的每个元素

我做了这笔交易

m_databaseRef.child("test")
    .runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData mutableData) {

            //increase nb element
            MutableData nbElementMD = mutableData.child("nbElement");
            Long nbElement = (Long) nbElementMD.getValue();
            if(nbElement == null){
                nbElement = 0L;
            }

            ++nbElement;
            nbElementMD.setValue(nbElement);

            //add element
            MutableData listMD = mutableData.child("list");
            MutableData element = listMD.child(nbElement.toString());
            element.setValue("Value" + nbElement.toString());

            return Transaction.success(mutableData);
        }

        @Override
        public void onComplete(DatabaseError databaseError, boolean b,
                               DataSnapshot dataSnapshot) {
            // Transaction completed
        }
    });
很好用。当我调用该函数时,“nElements”会适当增加,新元素会添加到数组中。但有一个问题。如果在事务开始时设置断点,我就运行了事务。我可以在watch窗口中看到变量“MutableData MutableData”。结果是这样的

MutableData { key = <none>, value = {list={3=Value3, 2=Value2, 1=Value1, 4=Value4}, nbElement=4} }
MutableData{key=,value={list={3=Value3,2=Value2,1=Value1,4=Value4},nbElement=4}
然后,在交易开始时,可以在客户端应用程序中看到数组的每个元素。也就是说,客户从互联网上收到了每一个元素。我不想接收数组的每个元素,我只想增加一个数据并在数组中添加一个元素。如果阵列很大,从网络传输的数据将毫无理由地变得巨大。有没有一种方法可以避免在“测试”中接收所有数据,而只更改我想要的数据


谢谢

看起来这是预期的行为。我不得不进行“黑客”操作,以避免将所有列表发送给客户。客户端也会将所有数据重新发送到服务器。然后,如果您有一个包含100个元素的数组,并且希望在事务中添加一个元素,则每个元素都将被发送到客户端,客户端将向服务器重新发送所有100+1元素

但firebase中的一项新功能似乎可以满足我的要求

Firebase功能!我不知道什么时候该功能将不再处于“测试版”,但我会看看这个