【问题标题】:FireBase onChildAdded() triggers onChildRemoved()FireBase onChildAdded() 触发 onChildRemoved()
【发布时间】:2016-09-08 12:04:07
【问题描述】:

我试图了解这两者之间的关系。来自文档:

onChildAdded 事件会为每个现有的孩子触发一次,然后在每次将新的孩子添加到指定路径时再次触发。侦听器被传递一个包含新孩子数据的快照。

还有:

onChildRemoved 事件在删除直接子项时触发。它通常与 onChildAdded 和 onChildChanged 事件结合使用。传递给事件回调的快照包含已删除子项的数据。

所以技术上我期望这两个事件根据它们的角色分别触发:也就是说,onChildAdded 将在我添加新数据时触发,而onChildRemoved 是当我从@987654326 中删除child 时@。

但是,当我添加数据时,这是我记录的内容:

14:47:39.649 31305-31305/com.myapp D/addData_: onChildRemoved called
14:47:39.649 31305-31305/com.myapp D/addData_: onChildAdded called

onChildRemovedonChildAdded 之前首先被调用!!更糟糕的是数据从我的listview 中消失了。有人帮助我了解我做错了什么。

这是我的数据结构:

还有我的火力基地参考:

 ref = FirebaseDatabase.getInstance().getReference().child("sales/" + getId() + "/" + getDateTime());
    
        //limit to the last data
        final Query lastSale = ref.limitToLast(1);
        //add on child event listener
        lastSale.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
                //get the data from firebase and add it to our model
               
                MyModel model = dataSnapshot.getValue(MyModel.class);
                String firebase_key = dataSnapshot.getKey();
 Log.d("addData_", "onChildAdded called");
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                Log.d("addData_", "onChildChanged called");
            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
                Log.d("addData_", "onChildRemoved called");
             
            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {
                Log.d("addData_", "onChildMoved called");
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

【问题讨论】:

    标签: android firebase-realtime-database


    【解决方案1】:

    我注释掉了他的台词,它成功了!

     //limit to the last data 
            final Query lastSale = ref.limitToLast(1); 

    【讨论】:

    • limitToLast 没有解决您描述的上述问题所以从技术上讲,我期望这两个事件根据它们的角色分别触发:也就是说,当我添加新数据时会触发 onChildAdded,而当我添加新数据时会触发 onChildRemoved从节点中删除一个子节点。
    • 出于某种原因,我一遍又一遍地复制这种反应。我仍然无法解释。但上述操作给了我预期的结果。
    • 这个问题你解决了吗stackoverflow.com/questions/39765033/…
    • 我确实有朋友 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多