Firebase запускает транзакцию иногда неправильно на Android - PullRequest
0 голосов
/ 25 марта 2019

Я работаю с базой данных Firebase в реальном времени, я создал 2 узла, один содержит список того же элемента, а другой содержит только размер списка, подобный этому:

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

и я использовал runTransaction для увеличения / уменьшения RegResultOnlyToTal при добавлении / удалении элемента в RegResult, он хорошо работает, когда я проверяю время сервера, но когда он становится большим, я проверял снова, и это было неправильно, кажется, что 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) {

        }
    });
}

Может кто-нибудь сказать мне, где я был не прав?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...