我正在将新数据添加到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));
});
这是我的数据库结构。我正在组织
下创建新的孩子请求帮我解决这个问题
答案 0 :(得分:4)
您在附加limitToLast(1)
时提到您正在使用crudListener
。实际上它是如何运作的。
来自Quer#limitToLast() reference
limitToLast()
方法用于设置要为给定回调同步的最大子项数。如果我们将限额设置为100,我们最初只会收到最多100个child_added
个事件。如果我们的数据库中存储的消息少于100条,则会为每条消息触发child_added
事件。但是,如果我们有超过100条消息,我们只会收到最后100条有序消息的child_added事件。随着项目的更改,我们将收到从活动列表中删除的每个项目的child_removed
个事件,以便总数保持为100。
如果您使用limitToLast(1)
,如果插入新子项以维持限制(即1),则会调用onChildRemoved()
,然后onChildAdded()
调用新子项。< / p>
如果您不想要此行为,请删除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) {
}
});
}
答案 1 :(得分:0)
我有类似的&#34;意想不到的&#34;当我使用过滤运算符onChildRemoved
时,行为与orderByChild("someKey").equalTo(someValue)
相关联。
离线我添加了新项目。当出现连接时,我添加的项目远程与firebase数据库同步。出乎意料的是onChildRemoved
被要求增加值。当我删除运算符orderByChild("someKey").equalTo(someValue)
时,onChildRemoved
并未被触发。但是onChildChanged
被调用了。
希望能在几个小时内救人。