【问题标题】:Android Firebase query listener not listening if no values in database [duplicate]如果数据库中没有值,Android Firebase 查询侦听器不侦听 [重复]
【发布时间】:2018-02-08 12:15:46
【问题描述】:

我是 firebaseandroid 的新手。我正在尝试使用 firebase 为 android 开发一个聊天应用程序。
为了获取我在 firebase 查询下使用的聊天。它正在检索所有消息,如果 chatId 存在,则工作正常。

mChatQuery = mFirebaseChatRef.child(chatId).orderByChild("chatId").equalTo(chatId);
mChatQuery.addChildEventListener(ChatActivity.this);

我面临的问题是,如果 chatId 不存在,查询不会返回任何值。
我的问题是如何识别值是null,而不使用另一个查询来检查chatId isExist?

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    试试这个:

      DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child(chatId).orderByChild("chatId").equalTo(chatId);
    ref.addValueEventListener(new ValueEventListener(){
     @Override
     public void onDataChange(DataSnapshot dataSnapshot) {
      if(dataSnapshot.exists()){
          //check if chatid is in the db
         for(DataSnapshot data : dataSnapshot.getChildren()){
                // retrieve also
         }
       }
     else{
             //does not exists, do something here
          } 
    
    }
    
    @Override
    public void onCancelled(FirebaseError firebaseError) {
    
    
         }
       });
    

    您可以使用上面的查询来检索值并检查它是否存在(一个查询)在数据库中。但是if(dataSnasphot.exists()) 仅适用于 valueventlistener 而不是 childeventlistener

    【讨论】:

    • 不工作 :( 如果chatid 不存在,onDataChange 甚至不调用
    • remove orderByChild("chatId").equalTo(chatId); @Aabauser 你按照上面的方法试过了吗?
    • 那么在您的参考文献中使用之前,只需检查chatid 是否无效。
    • 不,我不能删除 orderByChild("chatId").equalTo(chatId),因为数据快照 getChildren 还有一些其他值。它会影响逻辑。我只能使用ChildEventListener@PeterHaddad
    • @Aabauser 好的,检查chatId 是否为空。但是你仍然可以保留它并使用 valueeventlistener,你所需要的只是添加 for 循环作为答案
    【解决方案2】:

    ChildEvent 监听器不能监听不存在的节点,ValueEvent 监听器可以。

    您可以做的是,将相同的查询附加到 ValueEventListener。

    现在看到这里的技巧,一个firebase节点永远不会存在零子节点。

    在 value 事件监听器的 onDataChange() 方法中,您可以检查孩子的数量,如上所示,您应该检查节点是否存在。

    mChatQuery = mFirebaseChatRef.child(chatId).orderByChild("chatId").equalTo(chatId);
    mChatQuery.addValueEventListener((new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
    
            if(dataSnapshot.getChildrenCount()==0){
                //This indicates that the chatId doesn't exist
            }else{
                //Do what you want with the snapshot
            }
    
        }
    
        @Override
        public void onCancelled(FirebaseError firebaseError) {
    
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 2023-03-19
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多