【问题标题】:How to check existing of snapshot if you use ChildEventListener?如果使用 ChildEventListener,如何检查是否存在快照?
【发布时间】:2020-01-22 01:58:54
【问题描述】:

在 firebase 中,我尝试使用 ChildEventListener。但在某些情况下,我正在寻找的快照不存在。如果没有快照,甚至不调用子事件监听器的方法。我发现要检查快照的存在,我需要使用ValueEventListener。但是使用ValueEventListener 进行检查和使用ChildEventListener 后不方便。那么,有什么解决办法吗?

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    if(dataSnapshot.exists() 只能与 ValueEventListener 或 SingleValueEvent 一起使用,不能与 ChildEventListener 一起使用。

    但如果你想使用 ChildEventListener 则将其嵌套在 ValueEventListener

    例子:

     mRootRef.child("user").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
           if(dataSnapshot.exists()){
    
             //add childeventlistener here
    
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
    
        }
    });
    

    【讨论】:

    • 这会将所有内容下载两次
    • 确实,但这是问题的唯一解决方案。另一种解决方案是更改数据库的结构,这样您就不会下载所有内容两次。但是原始问题中甚至没有提供结构:/
    • 我想你是对的,我最终得到的是,我只下载了列表中的一项来检查它(.limitToFirst(1) ... exists())。如果它不是列表,但在这种情况下是用户,则可以使用单个子项进行检查,如果用户存在,则该子项不能为空,可能包含尽可能少的内容,例如.child('username') ... exists()
    • 当然,我知道。我需要 ChildEventlistener,它是一个聊天应用程序。我需要 ValueEventListener 来检查某个聊天中是否还有任何消息。否决,因为用户对象可能很大,例如传记,各种统计数据等。下载两次在生产中会很昂贵
    • 您需要将两个用户之间的聊天放在一个节点上,而将用户信息放在另一个节点上。这就是为什么您只检索两个用户的对话而不检索其他不相关的内容
    猜你喜欢
    • 2018-06-11
    • 2021-04-24
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    相关资源
    最近更新 更多