У меня есть эта база данных, когда мне нужно прочитать значение для предыдущего 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());
}
});
}
Моя проблемаявляется то, что при первом создании 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);