我正在尝试编写一个查询来检查 mcustDeliveryStatus 上是否有任何“待处理”状态。我想检查 Order 节点是否有 mcustDeliveryStatus 的待处理状态。
我编写了以下查询
mDatabase = FirebaseDatabase.getInstance().getReference("Order");
final Query query = mDatabase.OrderByChild("mcustDeliveryStatus").equalTo("Pending");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Toast.makeText(VWelcome.this, "new order", Toast.LENGTH_LONG).show();
Intent i = new Intent(VWelcome.this, ViewOrderRequest.class);
startActivity(i);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
此查询工作正常,但问题是即使我的 Order 节点中没有 Pending 状态, Intent 也会运行。有人知道为什么吗?
最佳答案
由于您使用 @NonNull
注释您的 DataSnapshot
对象,这意味着您告诉编译器您的对象不能为 null
,因此它总会返回一些东西。换句话说,如果没有结果,它将返回一个空的 DataSnapshot 对象。要解决此问题,您应该使用以下代码行检查该对象内有多少个子对象:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference orderRef = rootRef.child("Order");
Query query = orderRef.orderByChild("mcustDeliveryStatus").equalTo("Pending");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long count = dataSnapshot.getChildrenCount();
if (count > 0) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String mGasBand = ds.child("mGasBand").getValue(String.class);
Log.d(TAG, mGasBand);
}
} else {
Log.d(TAG, "No data!");
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
query.addListenerForSingleValueEvent(valueEventListener);
关于java - 如何检查 firebase 实时数据库中是否存在特定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58015008/