Firebase数据库侦听器返回null值

时间:2018-05-26 05:17:30

标签: java android firebase firebase-realtime-database

我有这个数据库,我需要读取transaction_statusnull下的transaction_user的值,如果它是null,则用户填充在节点transaction_status下,如果不是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()); } }); } 下的节点是使用OnCreate在transaction_user下触发的Firebase功能创建的,并且只能由任何用户读取。

transaction_status

enter image description here 我的问题是,第一次创建null时,会触发该函数创建null;当我关闭应用程序并再次打开它时,代码将运行查找以前的事务,但值返回{ "rules": { "transaction_users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } }, "transaction_status": { "$transactionId": { ".read": "auth !=`null`", ".write": false } } } } 再次重新创建所有内容,包括函数触发器,但下次打开应用程序时,值不是{{1我希望这是第一次。

这是规则:

null

为什么它第一次返回null,我可以看到数据库中的值但仍然返回transaction_status,这只会在用户上传后第二次发生,第二次和将返回正确的值。

null是由函数创建的吗?

是否与规则有关?

是否与Firebase数据库的异步特性相关?

我怎样才能确保在我第一次听到这个值时才能正确阅读?

如果我尝试检查用户创建的值,它第一次返回非FirebaseDatabase.getInstance().setPersistenceEnabled(true);

其他信息: 我有:

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

String line = "";
while ((line = br.readLine()) != null) {
  output += line;
}

output = "{" + output + "}";

1 个答案:

答案 0 :(得分:1)

要解决此问题,请更改以下代码行:

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

if (dataSnapshot.exist())

关于exist()方法的官方文档:

  

如果快照包含非空值,则返回true,否则返回false。