我有这个数据库,我需要读取transaction_status
下null
下的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
我的问题是,第一次创建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 + "}";
答案 0 :(得分:1)
要解决此问题,请更改以下代码行:
if (dataSnapshot.getValue() ==`null`)
到
if (dataSnapshot.exist())
关于exist()方法的官方文档:
如果快照包含非空值,则返回true,否则返回false。