Firebase数据库未检索数据

伊曼纽尔·奥涅卡(Immanuel Onyeka)

这是我第一次使用Firebase,并且我有一些方法都包含在同一个类中,这些方法无法正常工作。即使我在控制台中看到存储在name处的值不为null时,nameExists始终返回false。userStatus是此类中的DataSnapshot字段。

public Boolean nameExists(String name){
    if (getUserStatus(name) != null){
        return true;
    } else{ return false; }
}

 public String getUserStatus(String name){
    DatabaseReference tmpRef = FirebaseDatabase.getInstance().getReference().child("userStatuses").child(name);
    ValueEventListener v = new statusesListener();
    tmpRef.addValueEventListener(v);
    tmpRef.removeEventListener(v);
        return userStatus;
}

 private class statusesListener implements ValueEventListener{

    public void onDataChange(DataSnapshot snap){
        userStatus = (String) snap.getValue();
    }
    public void onCancelled(DatabaseError error){
    }

}

谢谢您的帮助

鲍勃·斯奈德

您忽略了ValueEventListener回调的异步性质添加侦听器时,通常需要先从Firebase服务器获取该值,然后才能由onDataChange()回调提供该值回调异步触发,通常在添加侦听器后数毫秒。

在您的代码中,getUserStatus()添加statusesListener,然后将其删除并返回userStatus所有这些都是在onDataChage()触发之前发生的,因此的值userStatus保持不变。

同样,添加和立即删除aValueEventListener不是典型的用例,并且鉴于侦听器的异步性质,可能导致其永不触发。最好使用Query.addListenerForSingleValueEvent()添加侦听器,这样可以一次性给您提供该值,并且不需要删除该侦听器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章