【问题标题】:Gathering data from Firebase asynchronously: when is the data-set complete?从 Firebase 异步收集数据:数据集何时完成?
【发布时间】:2016-03-19 23:41:33
【问题描述】:

在我目前正在开发的 Firebase Android 应用中,我想提供一个导出功能。此功能应允许用户导出一组存储在 Firebase 中的数据。

我的计划是将所有需要的数据收集到一个可以(重新)用于多种导出类型的中间对象(数据结构)中。

我遇到的问题是,由于我使用的是平面 Firebase 数据结构(如 https://www.firebase.com/docs/android/guide/structuring-data.html 中所述),很难知道何时收集了导出所需的所有数据。

示例:在检索使用“索引”(名称:键,值 true)引用的所有对象时,我为每个对象设置了一个 addListenerForSingleValueEvent 侦听器,但因为它返回异步,所以无法确定所有检索索引。这样就无法确定开始导出的正确时间。

谁有应对此问题的最佳实践?

【问题讨论】:

  • 一种方法是对您开始加载的索引进行计数,并在返回时递减。当你达到 0 时,你就完成了。
  • 您要将此数据导出到平面 ascii 文件吗?
  • @Jay 不,不是在这种情况下,但可能在未来的应用程序中。为什么要问?
  • @FrankvanPuffelen,我目前正在研究这种方法。一旦我有一些工作,我会发布一个小代码示例。

标签: asynchronous firebase firebase-realtime-database


【解决方案1】:

发布此内容是为了展示@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() );
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2019-04-20
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多