如何获得静态Firebase值

时间:2018-10-05 00:52:16

标签: java android firebase firebase-realtime-database

我想从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));
}  

1 个答案:

答案 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更新得分字段。