Слушатель базы данных Firebase возвращает нулевое значение - PullRequest
0 голосов
/ 26 мая 2018

У меня есть эта база данных, когда мне нужно прочитать значение для предыдущего transitTransactions в transaction_status, если оно равно null, пользователь заполняет узел transaction_user, если нет, null просто читаетданные из узла, чтобы избежать повторной загрузки тех же данных.Узлы в transaction_status создаются с помощью функций Firebase, запускаемых OnCreate в transaction_user/{uId}/{key}, и предназначены для чтения только любым пользователем.

    private void checkForPreviousTransactions(TransitTransaction transitTransaction) {
        String key = transitTransaction.getKey();
//        FirebaseDatabase.getInstance().getReference().child("transaction_users").child(userId).child(key).addListenerForSingleValueEvent(new ValueEventListener() {
        FirebaseDatabase.getInstance().getReference().child("transaction_status").child(key).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.getValue() ==null) {
                    HashMap<String, Object> result = new HashMap<>();
                    result.put("is_delivered", false);
                    result.put("is_in_transit", true);
                    result.put("is_processed", false);
                    FirebaseDatabase.getInstance().getReference().child("transaction_users").child(userId).child(key).updateChildren(result);
                } else {
                    isDelivered = (boolean) dataSnapshot.child("is_delivered").getValue();
                    isInTransit = (boolean) dataSnapshot.child("is_in_transit").getValue();
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.e(TAG, databaseError.getMessage());
            }
        });
    }

enter image description here Моя проблемаявляется то, что при первом создании transaction_user функция запускается, создавая transaction_status;когда я закрываю приложение и снова открываю его, код запускается в поисках предыдущих транзакций, но значение возвращает null, воссоздающее все заново, включая триггер функции, но в следующий раз, когда я открываю приложение, значение не равно null, поскольку яЯ ожидаю, что это будет самый первый раз.

Это правила:

{
  "rules": {
    "transaction_users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    },
    "transaction_status": {
      "$transactionId": {
        ".read": "auth !=`null`",
        ".write": false
      }
    }
  }
}

Почему он возвращает null в первый раз, я вижу значение в базе данных, новсе равно он возвращает null, это происходит только в следующий раз после загрузки пользователем, секунда и далее вернет правильное значение.

Это то, что transaction_status созданы функциями?

Имеет ли это какое-либо отношение к правилам?

Что-то связано с асинхронной природой базы данных Firebase?

Как я могу гарантировать, что она будет правильно прочитана в первый разчто я слушаю для этого значения?

Если я пытаюсь проверить значение, созданное пользователем, оно возвращает не null в первый раз.

Additional Info: у меня есть:

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

и:

FirebaseDatabase.getInstance().getReference().child("transaction_users").keepSynced(true);

1 Ответ

0 голосов
/ 26 мая 2018

Чтобы решить эту проблему, измените следующую строку кода:

if (dataSnapshot.getValue() ==`null`)

на

if (dataSnapshot.exist())

Из официальной документации, касающейся метода exist () :

Возвращает true, если снимок содержит ненулевое значение, в противном случае false.

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