我的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里面永远不会被调用。
提前谢谢
答案 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
将被解雇。
希望这会有所帮助:)