【问题标题】:Firebase Android addListenerForSingleValueEvent sometimes not returning dataFirebase Android addListenerForSingleValueEvent 有时不返回数据
【发布时间】:2016-06-08 12:58:51
【问题描述】:

当我的应用程序启动时,我会在我的 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) {}
});

【问题讨论】:

  • 快速提问:您是否使用身份验证?您是否在同一个应用程序中访问多个数据库(或者您以前使用同一个应用程序访问不同的数据库)?
  • 是的,我正在使用身份验证。我只访问一个数据库。顺便说一句,即使重新启动设备也没有解决它。
  • 这个问题是在我开始使用新的SDK之后才开始出现的。
  • 我可以结合这个问题的解决方案来重现这个问题:stackoverflow.com/questions/31670234/… 所以如果我创建一个包含单值侦听器的值侦听器,单值侦听器永远不会返回任何数据,所以一切都冻结了。这个@FrankvanPuffelen 有什么解决方案吗?我做错了吗?如果您愿意,可以在 PM 上复制开源项目。
  • 我今天遇到了同样的问题,我通过注销当前用户来临时修复它,即使我从数据库中删除它仍然在应用程序中可用

标签: android firebase firebase-realtime-database


【解决方案1】:

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

【讨论】:

  • 我对 addListenerForSingleValueEvent 有同样的问题,第一次启动应用程序时,它的调用正确,但下次我返回应用程序时,它不会调用任何覆盖方法。我现在尝试了 keepsynced 及其工作。
  • 但事实上新 SDK 存在问题
【解决方案2】:

请像这样尝试。 如果你不能解决这个问题,请给我分享这部分的源代码。 ...

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) {
    }
});

【讨论】:

    【解决方案3】:

    我的猜测是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();
            }
        });
    

    【讨论】:

      【解决方案4】:

      我这几天一直有同样的问题,我终于解决了。

      看来我的 Api 密钥已更改!这就是阻止addListenerForSingleValueEvent()返回的原因!
      转到Firebase Console,打开您的项目,单击设置图标,然后转到项目设置。在那里你会看到Web API Key。将其复制到项目目录中的google-services.json 文件中。这是该文件中的一个 sn-p:

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

      就是这样。用 Firebase 中的密钥替换“current_key”的值后,它恢复了工作(以前它有一些其他密钥,我认为我在Google Console 生成了它,它工作了几个月。就在几天前它停止工作)

      【讨论】:

        猜你喜欢
        • 2020-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 2018-08-11
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多