我在 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() 函数吗?
最佳答案
ChildEventListener
中的方法会针对初始数据和 对该数据的后续更改触发。
一旦您调用了 addChildEventListener()
,您将会为每个现有的子节点调用 onChildAdded()
。您可以使用这些事件来构建初始树。添加初始数据后,随着数据的变化,您将收到对所有 onChild...
方法的调用。
所以不要注册 addListenerForSingleValueEvent()
并简单地从 ChildEventListener
的方法构建树。
或者如果您想单独处理初始数据,您可以使用 event guarantees that Firebase has 之一:
Value events are always triggered last and are guaranteed to contain updates from any other events which occurred before that snapshot was taken.
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");
}
});
关于android - 如何使用这两个函数在 Firebase- Android 上监听数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33956849/