Firebase Android addListenerForSingleValueEvent有时不会返回数据

时间:2016-06-08 12:58:52

标签: android firebase firebase-realtime-database

当我的应用程序启动时,我会在Firebase数据库中查看当前用户的详细信息(我正在存储它的uid)。

我将addListenerForSingleValueEvent附加到用户的ref以读取它的数据。

我的问题是,有时,它不会返回任何价值,既不成功也不失败。

仅清除应用程序的数据才能解决问题,但当然会强制用户再次登录。

我在SO阅读了一些帖子,但没有找到任何解决方案。

这是我的代码:

DatabaseReference newUser =    
FirebaseDatabase.getInstance().getReference("users/"+uid);
newUser.addListenerForSingleValueEvent(new ValueEventListener()     
    @Override
    public void onDataChange(DataSnapshot snapshot) {}

    @Override
    public void onCancelled(DatabaseError databaseError) {}
});

4 个答案:

答案 0 :(得分:5)

我看到的建议是在keepSynced(true)对象上调用Query

答案 1 :(得分:1)

请尝试这样。 如果您不能通过此方法求解,请发送“共享我”这一部分的源代码。 ...

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("users").child(uid).addListenerForSingleValueEvent(new ValueEventListener() {

    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()){
            final HashMap<String, Object> dataMap = (HashMap<String, Object>) dataSnapshot.getValue();
            for (String key : dataMap.keySet()){
                Object data = dataMap.get(key);
                try{
                    HashMap<String, Object> moneyData = (HashMap<String, Object>) data;
                    Money money = new Money(("", "");
                }catch (ClassCastException cce){
                    try{
                        name = String.valueOf(dataMap.get("username"));
                        email = String.valueOf(dataMap.get("useremail"));
                    }catch (ClassCastException cce2){
                    }
                }
            }                            
        // do something
        }else {
        // when empty data
        }
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
    }
});

答案 2 :(得分:0)

我的猜测是user/:id不存在。仔细检查您的错误输出:

DatabaseReference newUser = FirebaseDatabase.getInstance()
    .getReference("users")
    .child(uid)
    .addListenerForSingleValueEvent(new ValueEventListener()     
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            if (snapshot.exists()) {
                Log.i(TAG, snapshot.val());
            } else {
                Log.e(TAG, "Not found: " + uid);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e(TAG, databaseError.toString();
        }
    });

答案 3 :(得分:-1)

我几天都遇到了同样的问题,我终于修好了。

看起来我的Api键已经改变了!这就是阻止addListenerForSingleValueEvent()返回的原因!
转到Firebase Console,打开项目,点击设置图标gear icon,然后转到项目设置。在那里,您会看到Web API Key。将其复制并复制到项目目录中的google-services.json文件中。这是该文件的摘录:

  ...
  ],
  "api_key": [
    {
      "current_key": "<COPY Web Api Key HERE>"
    }
  ],
  ...

那就是它。替换&#34; current_key&#34;的值后使用来自Firebase的密钥,它恢复了工作(以前它有一些其他密钥,我认为我在Google Console生成了它并且它工作了几个月。就在几天前它停止了工作)