晚上好。
我对Android的Firebase实时数据库有一种奇怪的行为。
我会尝试编写一个简单的笔记应用程序。我的数据结构非常简单:
请记住 last_update 字段。
我在服务中拥有正确的数据库引用。在onCreate中,我将ValueEventListener添加到我的引用中。我选择这个监听器是因为我希望在创建服务时,同步该登录用户的每个笔记。
在onValueChanged
方法内部,在数据处理之后,我删除ValueEventListener
并添加ChildEventListener
,用于处理CRUD操作(添加,删除,更新)。
直到现在一切都很好。
我的代码是:
@Override
public void onCreate(){
...
database = FirebaseDatabase.getInstance().getReference().child("notes" + "/" + "current_user_uid");
database.addValueEventListener(valueEventListener);
}
所以,我的ValueEventListener
是:
private ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(TAG, "main --> " + dataSnapshot.toString());
...//some stuff for saving data in a local sqlite db, nothing related to my problem
database.removeEventListener(this);
database.addChildEventListener(childEventListener);
//so here I have removed the ValueEventListener and I have attached a ChildEventListener.
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d("firebase", databaseError.toString());
}
};
好的,我的ChildEventListener
是:
private ChildEventListener childEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.d(TAG, "add --> " + dataSnapshot.toString());
...//code for saving on my local db
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
Log.d(TAG, "update --> " + dataSnapshot.toString());
...//code for updating on my local db
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.d(TAG, "delete --> " + dataSnapshot.toString());
...//code for deleting from my local db }
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
Log.d(TAG, "moved --> " + dataSnapshot.toString());
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "error --> " + databaseError.toString());
}
};
好的,到现在为止,一切正常。
当我尝试排除已收到的笔记时,问题就开始了。我使用这段代码:
database.orderByChild(last_update).startAt(time).addValueEventListener(valueEventListener);
显然,第一次调用时变量 time 为0,然后我使用SharedPreferences在每次回调中保存System.currentTimeMillis
的值。我为ChildEventListener
做了同样的事情。此外,当创建/修改注释时,我对字段last_update使用System.currenTimeMillis
的值。
因此,如果记录的用户没有备注,一切正常。但是如果有一些笔记(例如,如果我带了几个笔记并重新启动服务),我就不会收到last_update<时间(正确),但是当我尝试使用以下内容更新笔记时
childReference.child(uid).updateChildren(HashMap);
未调用onNoteUpdated
回调,称为onNoteAdded
!有时在onNoteUpdated
之后调用onNoteAdded
。但是,如果我尝试多次更新注释,最后,在至少拨打onNoteAdded
之后,onNoteUpdated
再次有效。
我真的不明白为什么。有什么建议吗?
感谢。