2017-01-22 91 views
2

這是我的代碼讀取數據火力地堡:無法讀取火力地堡數據庫

final String[] booknum = {"0"}; 
    databaseReference.child("All BID").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
      booknum[0] =Long.toString(snapshot.getChildrenCount()); 
      Toast.makeText(getApplicationContext(), booknum[0],Toast.LENGTH_LONG).show(); 

     } 
     @Override public void onCancelled(DatabaseError databaseError) { 
      Log.w(TAG, "loadPost:onCancelled", databaseError.toException()); 
     } 
    }); 
    Toast.makeText(getApplicationContext(), booknum[0],Toast.LENGTH_LONG).show(); 

當我執行此,先敬酒(內ValueEventListener)打印正確的答案(例如「8」)。但是,無論如何,外面的烤麪包總是打印0。

請幫忙!

回答

0

ValueEventListener是異步的。監聽器內部的代碼行(包括booknum [0]的賦值)不能保證在寫入監聽器之外的代碼行之前執行。如果您在某些操作中依賴booknum [0]的新值,請考慮在onDataChange()內移動該操作以確保它使用新值。

+0

對不起,我試過了,但我無法修復它。你知道一種避免使用onDataChange()的方法嗎?我只需要「All BIID」中的項目數量。 – theBrainyGeek

+0

使用onDataChange()是正確的方法。並且您正在獲取onDataChange()中「所有BID」內的項目數量。它打印8. –

+1

我明白,但問題是,我得到的項目數量,以便我可以生成一個獨特的代碼,然後再放入新的數據。在我寫入新數據之前,onDataChange()不會執行。這就是爲什麼在這個代碼中首先打印外部Toast的'0',然後添加數據(使用唯一的代碼0),然後onDataChange()打印出8個數字。 對不起,我是數據庫管理新手,您的幫助非常高不勝感激! – theBrainyGeek