Android firebase实时数据库读取不存在的数据

Android firebase实时数据库读取不存在的数据,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我们遇到了firebase数据库中的一个主要错误,请参见下面的代码。下面的代码试图为没有读写权限的子“示例”设置一个值。写入操作不会向数据库写入任何内容,并在日志中抛出错误“setValue at/EXAMPLE/VALUE failed:DatabaseError:Permission denied”,这是一件好事 然而,一个主要的问题是后面的代码试图读取子“EXAMPLE”的值,代码实际上进入ondatachange方法并将值读取为“ONE”,而不是进入OnCancell方法抛出权限错误,数

我们遇到了firebase数据库中的一个主要错误,请参见下面的代码。下面的代码试图为没有读写权限的子“示例”设置一个值。写入操作不会向数据库写入任何内容,并在日志中抛出错误“setValue at/EXAMPLE/VALUE failed:DatabaseError:Permission denied”,这是一件好事

然而,一个主要的问题是后面的代码试图读取子“EXAMPLE”的值,代码实际上进入ondatachange方法并将值读取为“ONE”,而不是进入OnCancell方法抛出权限错误,数据甚至不存在于数据库中,并且子“示例”没有读写权限,因此fireabase如何声明读取不存在的值

myReftwo.child("EXAMPLE").child("VALUE").setValue("ONE");

myReftwo.child("EXAMPLE").child("VALUE").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot)
    {

        Log.d("print", dataSnapshot.getValue().toString()  );


    }
    @Override
    public void onCancelled(DatabaseError databaseError)
    {
        Log.d("print",  databaseError.getMessage() );
    }
});

在共享的代码段中,由于服务器拒绝,侦听器很可能在本地缓存更新之前从本地缓存中获取值

添加侦听器时,Firebase会尝试为您提供它希望节点立即具有的值。由于您调用了
addListenerForSingleValueEvent
,它会立即停止侦听该值。因此,您最终只能从本地缓存中看到过时的值,而从服务器中看不到实际值(或没有)

因此,您不应在应用程序中同时使用磁盘持久性和
addListenerForSingleValueEvent
。在同一场景中使用
addValueEventListener
将导致对
onDataChange
的两个调用:第一个调用来自本地缓存的值,第二个调用来自服务器的正确快照

有关这些行为如何起作用以及为什么它们不会导致您喜欢的行为的详细答案,请参见: