Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加新数据时,Firebase Android ChildEventListener在onChildAdded()之前触发onChildRemoved()_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

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

添加新数据时,Firebase Android ChildEventListener在onChildAdded()之前触发onChildRemoved(),android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我正在向Firebase添加新数据,如下代码所示 updateChildren(childUpdates, new DatabaseReference.CompletionListener() { @Override public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { } } 下面是ChildEventListe

我正在向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) {

        }

};
问题是,当我创建新数据时,在onchildededed()之前触发onChildRemoved()

我没有删除任何子项,但每次创建新子项时都会触发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));
 });
这是我的数据库结构。我正在组织下创建新的儿童


请帮助我如何解决此问题

您提到您正在使用
li‌mitToLast(1)
当连接
crudListener时
。这就是它的工作原理

limitToLast()
方法用于为给定回调设置要同步的最大子级数。如果我们将限制设置为100,我们最初将只接收最多100个添加的
child\u
事件。如果数据库中存储的消息少于100条,则会为每条消息触发一个
child\u added
事件。但是,如果我们有超过100条消息,我们将只收到最后100条已订购消息的一个添加了child_的事件。随着项目的变化,我们将为每个从活动列表中退出的项目接收
child\u removed
事件,以便总数保持在100

如果您使用
li‌​mitToLast(1)
,如果插入一个新的子项以保持限制(即1),则将调用
onChildRemoved()
,然后
onchildeded()
调用新的子项

如果不希望出现这种行为,请删除
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) {

        }
    });
}
当我使用过滤操作符
orderByChild(“someKey”).equalTo(someValue)
时,我在
onChildRemoved
上有类似的“意外”行为

脱机时,我添加了新项目。当连接出现时,我添加的项目与firebase数据库远程同步。意外地调用了
onChildRemoved
以获取附加值。。当我删除操作符
orderByChild(“someKey”).equalTo(someValue)
时,没有触发
onChildRemoved
。但是调用了
onChildChanged


希望它能节省一些时间。

你能把
儿童更新
的值、数据库结构和
crudListener
所附的参考资料张贴出来吗?如果任何子级的值更改为
null
我已编辑我的问题如何附加
crudListener
,则将触发onChildRemoved()?任何筛选方法,如
limitToFirst
limitToLast
等.child(Organizations.class.getSimpleName().toLowerCase()).limitToLast(1).addChildEventListener(crudListener);如果你没有用li‌​mitToLast(1)然后它将返回所有孩子的任何想法。然后,忽略
onChildRemoved()
方法,不要在该方法中实现任何内容:)我不能忽略onChildRemoved。你能解释为什么吗?但web版本不会发生。是Firebase Android SDK错误?