2017-05-25 78 views
0

我用这个代码来检查是否有我的数据库特定的数据:为什么OnDataChange()仍然被调用,即使数据库中没有数据?

mDatabase.child("TempTransaction").child(MainActivity.User.getID()).addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       if (dataSnapshot.child("state").getValue().equals("Pending")) { 

        mTransactionExist = true; 

       } else { 
        mTransactionExist = false; 
       } 

      } 

我首先想到的是,如果我有一个特定的孩子没有TempTransaction在我的JSON分贝ValueEventListener(onDataChange)应该永远不会被执行。事实证明,即使我将孩子“TempTransaction”更改为任何字符串,如仍然调用onDataChange的“asdasfasfx”或“xcvcxwasd”。 这是为什么?

是否有任何firebase的默认关键字或东西,使其跳过,如果没有在数据库结构中找到特定的孩子?

回答

2

A ValueEventListener将始终“立即”用该位置的当前值调用。如果该位置没有当前值,则会用空快照调用它。

有没有办法改变这种行为,但你可以检测用空快照用:

public void onDataChange(DataSnapshot dataSnapshot) { 
    if (dataSnapshot.exists()) { 
+0

谢谢。我现在知道了。 –

0

您需要使用addListenerForSingleValueEvent()方法。为特定位置的数据中的单个更改添加侦听器。这个监听器将会被该位置的数据值触发一次。

希望它有帮助。

+0

感谢,但这个没有真正回答我的问题,在我的情况下,我需要不断地听不只是一次。实际上问题将保持不变,即使我将addValueEventListener替换为listenerForSingleValueEvent。 –

+0

另一个方法是删除这样的监听器:'databaseReference.removeEventListener(valueEventListener);'当你认为不再需要监听时。你也可以使用'databaseReference.keepSynced(false);'来停止被同步的引用。除此之外,您可以使用'goOffline()'方法,该方法关闭与Firebase数据库后端的连接,直到调用goOnline()。 –

+0

我只需要解释听众的行为。为什么它会听一个不存在的孩子,在不存在数据的情况下调用onDataChange()会让我困惑。 –

相关问题