我想从Firebase DB获取一个值。我有一个分数,我想检查DB上的先前值,我将比较这些值并将DB上的值设置更高。这是我的代码,如下所示,但我不能取值:
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("Datas");
myRefchild=myRef.child(uuidstring).child("TimerMode").child("BestScore");
myRefchild.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//PrevBestValue=Integer.parseInt(dataSnapshot.getValue(String.class));
try {
PrevBestValue=Integer.parseInt(dataSnapshot.getValue(String.class));
}catch (Exception e){
Log.d("DBhata",e.toString());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
});
if (PrevBestValue<TotalScore){
myRefchild.setValue(Integer.toString(TotalScore));
}
答案 0 :(得分:0)
您不能简单地在PrevBestValue
方法之外使用onDataChange()
的值。基本上,您试图在异步的API中同步使用一个值。那不是一个好主意。您应该按预期异步处理API。
Firebase API为asynchronous
,这意味着onDataChange()
方法在被调用后立即返回,并且它返回的Task
对象的回调将在一段时间后被调用。无法保证需要多长时间。该数据可能需要几百毫秒到几秒钟的时间。由于该方法会立即返回,因此您尚未尝试在回调之外使用PrevBestValue
变量的值。
对此问题的快速解决方案是移动以下代码行:
if (PrevBestValue<TotalScore){
myRefchild.setValue(Integer.toString(TotalScore));
}
在onDataChange()
方法内,紧接以下代码行:
PrevBestValue=Integer.parseInt(dataSnapshot.getValue(String.class));
如果要在外部使用它,建议您从此 post 中查看anwser的最后一部分,其中我已说明了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。
但是,我向您展示了上述解决方案,以使您对异步API有所了解,但这不是您应该在多用户环境中更新score
字段的方式。为了获得一致的数据,建议您从此 post 中查看答案,在此我已经解释了如何使用Firebase Transactions更新得分字段。