从 Firebase 异步收集数据:data-set 何时完成?
Gathering data from Firebase asynchronously: when is the data-set complete?
在我目前正在开发的 Firebase Android 应用程序中,我想提供导出功能。此功能应允许用户导出一组存储在 Firebase 中的数据。
我的计划是将所有需要的数据收集到一个中间 object(数据结构)中,可以(重新)用于多种导出类型。
我 运行 遇到这样一个问题,因为我使用的是平面 Firebase 数据结构(如 https://www.firebase.com/docs/android/guide/structuring-data.html 中所述),很难知道何时需要导出所有数据已收藏。
示例:当检索所有使用 'indices' 引用的 object 时(名称:key,值为 true),我为每个设置了一个 addListenerForSingleValueEvent
侦听器,但是因为这 returns 是异步的,无法确定何时检索所有索引。这样就无法确定开始导出的正确时刻。
谁有应对这种情况的最佳做法?
发布此内容以展示@FrankvanPuffelen 的评论的一个可行示例,该示例似乎很好地完成了这项工作:
@Override
public void onDataChange(DataSnapshot indexListDataSnapshot) {
final long participantsRequired = indexListDataSnapshot.getChildrenCount();
for (DataSnapshot ds : indexListDataSnapshot.getChildren()) {
DataUtil.getParticipantByKey( mEventKey, ds.getKey() ).addListenerForSingleValueEvent( new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Participant p = dataSnapshot.getValue(Participant.class);
mParticipants.add( p );
if (participantsRequired == mParticipants.size()){
executeExport();
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
mListener.onDataLoadFailure( firebaseError.toException() );
}
});
}
}
在我目前正在开发的 Firebase Android 应用程序中,我想提供导出功能。此功能应允许用户导出一组存储在 Firebase 中的数据。
我的计划是将所有需要的数据收集到一个中间 object(数据结构)中,可以(重新)用于多种导出类型。
我 运行 遇到这样一个问题,因为我使用的是平面 Firebase 数据结构(如 https://www.firebase.com/docs/android/guide/structuring-data.html 中所述),很难知道何时需要导出所有数据已收藏。
示例:当检索所有使用 'indices' 引用的 object 时(名称:key,值为 true),我为每个设置了一个 addListenerForSingleValueEvent
侦听器,但是因为这 returns 是异步的,无法确定何时检索所有索引。这样就无法确定开始导出的正确时刻。
谁有应对这种情况的最佳做法?
发布此内容以展示@FrankvanPuffelen 的评论的一个可行示例,该示例似乎很好地完成了这项工作:
@Override
public void onDataChange(DataSnapshot indexListDataSnapshot) {
final long participantsRequired = indexListDataSnapshot.getChildrenCount();
for (DataSnapshot ds : indexListDataSnapshot.getChildren()) {
DataUtil.getParticipantByKey( mEventKey, ds.getKey() ).addListenerForSingleValueEvent( new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Participant p = dataSnapshot.getValue(Participant.class);
mParticipants.add( p );
if (participantsRequired == mParticipants.size()){
executeExport();
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
mListener.onDataLoadFailure( firebaseError.toException() );
}
});
}
}