Android 检查数据是否存在时,Firebase始终为true

Android 检查数据是否存在时,Firebase始终为true,android,database,firebase,firebase-realtime-database,Android,Database,Firebase,Firebase Realtime Database,我想检查当前2个引用处的数据是否存在,但它似乎总是返回true(总是第一个吐司),我认为没有检查URL\u CARS和URL\u PLANES是否存在,我得到的是: mDatabase.child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("URL_CARS").addValueEventListener(new ValueEventListener() { @Override

我想检查当前2个引用处的数据是否存在,但它似乎总是返回true(总是第一个吐司),我认为没有检查URL\u CARS和URL\u 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:

当您尝试读取数据时,Firebase将始终向您返回快照,并且快照永远不会为空。因为
Datasnapshot
对象由两个属性组成:
key
value
,所以它类似于
Datasnapshot(key,value)
。基于某个键查询数据库时,该值可能不存在(您的情况),但您已将该键传递给该Datasnapshot对象(这意味着该键存在)。因此,您得到的数据快照类似于:
Datasnapshot(key=“URL\u 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();
                        }
                    }

要解决此问题,请使用以下代码:

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);
正如您可能看到的,我使用了方法,如果快照包含非null值,则该方法返回true

还有一种方法听起来像这样:

if(dataSnapshot.hasChild("URL_CARS")()) {}
if(dataSnapshot.hasChild("URL_PLANES")()) {}

请添加您的数据库结构。为什么不创建两个不同的函数来使用不同的调用检查它们是否存在?这里是@AlexMamohi,我在问完问题后才这样做的,但它不起任何作用,似乎与dataSnapshotCars.getValue()有关=它解决了这个问题