2017-05-25 81 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()會讓我困惑。 –

相關問題