添加新数据时,Firebase Android ChildEventListener在onChildAdded()之前触发onChildRemoved()
我正在向Firebase添加新数据,如下代码所示添加新数据时,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
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));
});
这是我的数据库结构。我正在组织下创建新的儿童
请帮助我如何解决此问题您提到您正在使用
limitToLast(1)
当连接crudListener时
。这就是它的工作原理
从
limitToLast()
方法用于为给定回调设置要同步的最大子级数。如果我们将限制设置为100,我们最初将只接收最多100个添加的child\u
事件。如果数据库中存储的消息少于100条,则会为每条消息触发一个child\u added
事件。但是,如果我们有超过100条消息,我们将只收到最后100条已订购消息的一个添加了child_的事件。随着项目的变化,我们将为每个从活动列表中退出的项目接收child\u removed
事件,以便总数保持在100
如果您使用limitToLast(1)
,如果插入一个新的子项以保持限制(即1),则将调用onChildRemoved()
,然后onchildeded()
调用新的子项
如果不希望出现这种行为,请删除limitToLast(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);如果你没有用limitToLast(1)然后它将返回所有孩子的任何想法。然后,忽略onChildRemoved()
方法,不要在该方法中实现任何内容:)我不能忽略onChildRemoved。你能解释为什么吗?但web版本不会发生。是Firebase Android SDK错误?