Android - Firebase多对多关系儿童听众

时间:2017-01-24 13:05:36

标签: android firebase

我的firebase数据库具有以下结构:

tasks 
   - task_key_1:{
       - name: "task 1"
       - ...
       - users{
             user_key_1 : true
         }
   }

users
  - user_key_1{
        tasks{
             task_key_1 : true
        }
  }

现在,我想在活动中显示用户的任务列表。我找到了这种方法并且它正在工作:

myTasks.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {

            taskReference.child(dataSnapshot.getKey()).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                     ... 
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.e(TAG, databaseError.toString());
                }
            });
        }

        public void onChildRemoved(DataSnapshot dataSnapshot) {
            taskReference.child(dataSnapshot.getKey()).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot taskSnapshot) {
                  ......
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.e(TAG, databaseError.toString());
                }
            });

        }

        public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
        taskReference.child(dataSnapshot.getKey()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot taskSnapshot) {
               Log.w(TAG, "on child changed")
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.e(TAG, databaseError.toString());
            }
        });

            });
        }

        public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
            Log.w(TAG, "onChildMoved");
        }

        @Override
        public void onCancelled(DatabaseError error) {}

    });

其中: mytasks是对/ users / userId / tasks的引用 和taskReference是/ tasks / taskKeyOwnedByUser。

我的问题是:如何检测任务的更改,即用户更改其标题,然后更新列表UI?似乎" Log.w"在OnChildChanged里面永远不会被调用。

提前谢谢

1 个答案:

答案 0 :(得分:0)

这是我的方法,将users/<usersId>/tasks/<taskId>的值类型更改为时间戳值。然后,当您即将更新任务时,请务必同时更新时间戳,以便触发onChildChanged

这是您的数据库结构

users {
    - user_key_1 {
        tasks {
            task_key_1 : ServerValue.TIMESTAMP (Long value)
        }
    }
}

当您要更新任务名称

时,这是一个示例方法
Map<String, Object> values = new HashMap<>();
values.put("tasks/" + task_key + "/name", new_task_name);
values.put("users/" + user_key + "/tasks/" + task_key, ServerValue.TIMESTAMP);
ref.updateChildren(values);

使用这种方法,onChildChanged将被解雇。 希望这会有所帮助:)