我想检查当前2个引用的数据是否存在,但它似乎总是返回true(总是第一个Toast),我认为不检查URL_CARS和URL_PLANES是否存在,这是我的拥有:
mDatabase.child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("URL_CARS").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot dataSnapshotCars) {
mDatabase.child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("URL_PLANES").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshotPlanes) {
if (dataSnapshotCars!=null && dataSnapshotPlanes!=null) {
Toast.makeText(LoginActivity.this, "DATA EXISTS", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(LoginActivity.this, "Data DOSNT EXISTS", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
数据库结构
Users +_
-L4K1JDJS4K2599SK3+_
URL_CARS:
URL_PLANES:
答案 0 :(得分:1)
当您尝试读取数据并且它永远不会为空时,Firebase将始终为您返回快照。由于Datasnapshot
对象包含两个属性:key
和value
,因此它类似Datasnapshot(key, value)
。当您基于某个键查询数据库时,该值可能不存在(您的情况),但您已将该键传递给该Datasnapshot对象(这意味着该键存在)。因此,您获得的数据快照类似于:Datasnapshot(key="URL_PLANES", value=null)
。这意味着datasnapshot!=null
将永远为真。
您可以做的是使用exists()
方法检查值是否存在:
@Override
public void onDataChange(DataSnapshot dataSnapshotPlanes) {
if (dataSnapshotCars.exists() && dataSnapshotPlanes.exists()) {
Toast.makeText(LoginActivity.this, "DATA EXISTS", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(LoginActivity.this, "Data DOSNT EXISTS", Toast.LENGTH_SHORT).show();
}
}
或者获取快照值,然后检查它是否为空:
@Override
public void onDataChange(DataSnapshot dataSnapshotPlanes) {
if (dataSnapshotCars.getValue()!=null && dataSnapshotPlanes.getValue()!=null) {
Toast.makeText(LoginActivity.this, "DATA EXISTS", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(LoginActivity.this, "Data DOSNT EXISTS", Toast.LENGTH_SHORT).show();
}
}
答案 1 :(得分:1)
要解决此问题,请使用以下代码:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Users").child(uid);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.child("URL_CARS").exists()) {
Toast.makeText(LoginActivity.this, "DATA EXISTS", Toast.LENGTH_SHORT).show();
}
if(dataSnapshot.child("URL_PLANES").exists()) {
Toast.makeText(LoginActivity.this, "DATA EXISTS", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(eventListener);
正如您可能看到我使用了exists()方法,如果快照包含非空值,则返回true。
还有另一种听起来像这样的方法:
if(dataSnapshot.hasChild("URL_CARS")()) {}
if(dataSnapshot.hasChild("URL_PLANES")()) {}