在onChildAdded之后调用Android,Firebase,实时数据库,onChildChanged?

时间:2016-11-09 17:01:06

标签: android firebase firebase-realtime-database

晚上好。

我对Android的Firebase实时数据库有一种奇怪的行为。

我会尝试编写一个简单的笔记应用程序。我的数据结构非常简单:

    • 笔记
      • UID
          • 存档
          • 颜色
          • 日期
          • 文本
          • LAST_UPDATE

请记住 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再次有效。

我真的不明白为什么。有什么建议吗?

感谢。

0 个答案:

没有答案