2016-08-21 37 views
0

所以我通過有關如何檢索數據輸入火力地堡的文檔去:https://firebase.google.com/docs/database/android/retrieve-data瞭解火力地堡ValueEventListeners onDataChange()

在我火力的應用程序,我檢索使用addListenerForSingleValueEvent值。 onDataChange方法中檢索到的這些值(此處爲userIdKey)用於更新數據庫中的其他位置。

我所觀察到的是,有時候除了 在(參考下面的代碼)更新。

DatabaseReference channelFollowersRef = mDatabase.child("followers").child(mKey); 
    channelFollowersRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      for(DataSnapshot childSnapshot:dataSnapshot.getChildren()){ 
       String userIdKey=childSnapshot.getKey(); 
     /*123*/ delChannelMap.put("/user-subscriptions/" + userIdKey + "//" + mChannelKey,null); 
      } 

      delChannelMap.put("/channels/" + mChannelKey, null); 
      delChannelMap.put("/user-channels/" + getUid() + "/" + mChannelKey, null); 
      delChannelMap.put("/channels-notices/" + mChannelKey, null); 
      delChannelMap.put("/channels-subChannels/" + mChannelKey, null); 
      delChannelMap.put("/channels-subChannels-comments/" + mChannelKey, null); 
      delChannelMap.put("/channel-followers/" + mChannelKey, null); 

      mDatabase.updateChildren(delChannelMap, new DatabaseReference.CompletionListener() { 
       @Override 
       public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { 
        Toast.makeText(ChannelDetailActivity.this, "Channel is now deleted.", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 

如何解決這個問題。

也可以有人詳細說明onDataChange是如何工作的,當節點中的所有值被檢索或檢索到'某些'數據時它會被調用嗎?

應該在檢索數據時在這種情況下使用AsyncTask。

回答

1

您的代碼似乎刪除了從多個位置分散出來的數據。

當您執行諸如此類的多位置update()時,在進行任何更改之前,將檢查所有節點的安全規則。因此(除非Firebase執行這些特定安全規則的方式存在缺陷),則斷開連接不能由安全規則引起。

如果你的其他節點進行更新,但/user-subscriptions/" + userIdKey + "//" + mChannelKey不會被刪除,那麼你很可能不會在dataSnapshot得到任何孩子(因此沒有通過他們delChannelMap)。您需要在調試器中運行代碼來驗證。

無論何時排除此類問題,請務必處理onCancelled()。這是獲取操作失敗原因的最簡單方法。雖然我不認爲它會在這裏執行(畢竟,寫操作似乎成功),我建議你attach a completion callback to setValue

ref.setValue("My new value", new DatabaseReference.CompletionListener() { 
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { 
     throw databaseError.toException(); 
    } 
}); 

拋出這樣的異常保證,這將是非常困難的忽視這樣的下次錯誤。

+0

謝謝弗蘭克如果錯誤仍然存​​在,我會盡快回復您。 –

2
  1. onDataChange爲您提供了在單一時間每當有子節點的變化所有底層的子節點。

  2. Firebase在檢索數據時使用不同的線程執行其任務,因此不需要使用AsyncTask

  3. 您的代碼中的問題可能是由於此String userIdKey=childSnapshot.getKey(); ...其中childSnapshot.getKey();未激發您想要的數據..您應該檢查LOGCAT數據是否正確檢索。

如果還不清楚,請添加數據庫的Json數據,以便更容易理解正在發生的事情。

+1

對於#1:'onDataChange()'立即觸發當前值。但是它確實會使用* complete *節點來觸發。 Firebase *從不*激發部分節點。 –