Firebase Android ChildEventListener在onChildAdded()之前触发onChildRemoved()添加新数据时

时间:2016-09-29 08:21:19

标签: android firebase firebase-realtime-database

我正在将新数据添加到Firebase,如下面的代码

updateChildren(childUpdates, new DatabaseReference.CompletionListener() {
        @Override
        public void onComplete(DatabaseError databaseError,   DatabaseReference databaseReference) {

        }
}

以下是ChildEventListener的代码

fb.child(Organizations.class.getSimpleName().toLowerCase()).limitToLast(1).addChildEventListener(crudListener);

ChildEventListener crudListener = new ChildEventListener() {

        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Log.e(TAG,"onChildAdded "+ dataSnapshot.toString()+" \n String "+s);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            Log.e(TAG,"onChildChanged "+ dataSnapshot.toString()+" \n String "+s);
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            Log.e(TAG,"onChildRemoved "+ dataSnapshot.toString());
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
            Log.e(TAG,"onChildAdded "+ dataSnapshot.toString()+" \n String "+s);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

};

问题是我在创建新数据时 onChildRemoved() onChildAdded()

之前触发

我没有删除任何孩子,但每次创建新孩子时都会触发 onChildRemoved()

遵循Web(javascript)代码,它运行良好

 firebase.initializeApp(config);


 var commentsRef = firebase.database().ref('organizations').limitToLast(1);
 commentsRef.on('child_added', function(snap) {
    $('pre').text("child_added: "+JSON.stringify(snap.val(), null, 2));
 });

 commentsRef.on('child_changed', function(snap) {
    $('pre').text("child_changed: "+JSON.stringify(snap.val(), null, 2));
 });

 commentsRef.on('child_removed', function(snap) {
    $('pre').text("child_removed: "+JSON.stringify(snap.val(), null, 2));
 });

这是我的数据库结构。我正在组织

下创建新的孩子

enter image description here

请求帮我解决这个问题

2 个答案:

答案 0 :(得分:4)

您在附加li‌mitToLast(1)时提到您正在使用crudListener。实际上它是如何运作的。

来自Quer#limitToLast() reference

  

limitToLast()方法用于设置要为给定回调同步的最大子项数。如果我们将限额设置为100,我们最初只会收到最多100个child_added个事件。如果我们的数据库中存储的消息少于100条,则会为每条消息触发child_added事件。但是,如果我们有超过100条消息,我们只会收到最后100条有序消息的child_added事件。随着项目的更改,我们将收到从活动列表中删除的每个项目的child_removed个事件,以便总数保持为100。

如果您使用li‌​mitToLast(1),如果插入新子项以维持限制(即1),则会调用onChildRemoved(),然后onChildAdded()调用新子项。< / p>

如果您不想要此行为,请删除li‌​mitToLast(1)方法

修改 如果您想继续使用limitToLast(1),那么您必须检查组织条目是否真的从数据库中删除,或者是否来自限制行为。

@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
    dataSnapshot.getRef().addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (!dataSnapshot.exists()) {
                // remove this organization item from the RecyclerView
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

答案 1 :(得分:0)

我有类似的&#34;意想不到的&#34;当我使用过滤运算符onChildRemoved时,行为与orderByChild("someKey").equalTo(someValue)相关联。

离线我添加了新项目。当出现连接时,我添加的项目远程与firebase数据库同步。出乎意料的是onChildRemoved被要求增加值。当我删除运算符orderByChild("someKey").equalTo(someValue)时,onChildRemoved并未被触发。但是onChildChanged被调用了。

希望能在几个小时内救人。