2017-01-22 76 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