Android Firebase addListenerForSingleValueEvent不起作用

时间:2017-09-24 06:43:54

标签: android firebase firebase-realtime-database

我知道这已被问过很多,但我仍然可以让它发挥作用。这是我的代码:

private int test;

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userRef = rootRef.child("Users");

test = 0;
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.hasChild(userID))
            test = 1;
        else
            test = 2;
   }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

Log.d(TAG, "Test = " + test);

这是Firebase上的内容:

  • 应用程序名称-e545e
    • 用户
      • 用户ID

我不知道为什么,但变量" test"始终返回值0,这意味着addListenerForSingleValueEvent不起作用。感谢您提供先进的帮助

2 个答案:

答案 0 :(得分:7)

数据是从Firebase异步加载的。当您的日志test时,onDataChange尚未运行。

要查看此操作,请在 onDataChange内添加更多记录

private int test;

test = 0;
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.hasChild(userID)) {
            test = 1;
        }
        else {
            test = 2;
        }
        Log.d(TAG, "Test2 = " + test);
   }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException(); // Don't ignore errors
    }
});

Log.d(TAG, "Test = " + test);

现在你首先看到:

  

测试= 0

然后一旦数据加载并调用onDataChange

  

测试= 1

  

测试= 2

因此,您应始终在onDataChange()内放置(或调用)需要数据库数据的代码。

答案 1 :(得分:0)

上帝,我在这里呆了几分钟。我原来是在下载 google-services.json 后在 firebase 控制台中创建了数据库。

您必须从项目配置中再次下载 google-services.json,这一次将正确引用数据库

然后清理项目,卸载并安装应用程序以确保新的配置文件已交付。

“项目信息”:{ "project_number": "596410010449", "firebase_url": "https://yourname.europe-west1.firebasedatabase.app",