我在Firebase上的数据是这样的:
"node": {
"node1": {
"value1": value,
"value2": value,
"subSubNode":{
//....values....//
},
},
"node2": { ... },
"node3": { ... }
//...and so on ..//
}
首先:我想从Firebase获取所有数据并渲染到我的树,所以我使用了 addListenerForSingleValueEvent()函数。
然后:我使用 addChildEventListener()函数来监听节点或子节点何时更改,删除或添加...
private void getData(Query ref){
ref.addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
**I render data on my tree here**
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.i(TAG, "onChildAdded");
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
Log.i(TAG, "onChildChanged");
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.i(TAG, "onChildRemoved");
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
Log.i(TAG, "onChildMoved");
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.i(TAG, "onCancelled");
}
});
}
但 addChildEventListener()函数中的 onChildAdded()方法始终先运行。我有什么想法或解决方案吗?我在该位置使用 addChildEventListener()函数是否正确?
答案 0 :(得分:3)
ChildEventListener
中的方法会触发初始数据和,以便对该数据进行后续更改。
致电addChildEventListener()
后,您将收到每个现有子节点的onChildAdded()
电话。您可以使用这些事件来构建初始树。添加初始数据后,随着数据的变化,您将收到对所有onChild...
方法的调用。
因此,请勿注册addListenerForSingleValueEvent()
,只需使用ChildEventListener
的方法构建树。
或者如果您想单独处理初始数据,可以使用其中一个event guarantees that Firebase has:
值事件总是最后触发,并且保证包含在拍摄快照之前发生的任何其他事件的更新。
boolean isInitialValueLoaded = false;
ref.addListenerForSingleValueEvent(new ValueEventListener(){
public void onDataChange(DataSnapshot dataSnapshot) {
**I render data on my tree here**
isInitialValueLoaded = true;
}
public void onCancelled(FirebaseError firebaseError) {
}
});
ref.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if (!isInitialValueLoaded) return;
Log.i(TAG, "onChildAdded");
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
if (!isInitialValueLoaded) return;
Log.i(TAG, "onChildChanged");
}
public void onChildRemoved(DataSnapshot dataSnapshot) {
if (!isInitialValueLoaded) return;
Log.i(TAG, "onChildRemoved");
}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
if (!isInitialValueLoaded) return;
Log.i(TAG, "onChildMoved");
}
public void onCancelled(FirebaseError firebaseError) {
Log.i(TAG, "onCancelled");
}
});