【问题标题】:How to make sure every related Firebase data have completely loaded?如何确保每个相关的 Firebase 数据都已完全加载?
【发布时间】:2017-03-20 10:30:38
【问题描述】:

免责声明:我提出这个问题并自己回答,因为我需要一个“更大的板”来回答this post 的扩展问题(因为整个解释永远不会适合评论

我有这些数据:

{
    "users" : {
        "randomUserId" : {
            "books" : {
                "booksId1" : true,
                "booksId2" : true
            }
        }
    },
    "books" : {
        "booksId1" : {
            "title" : "Awesome Book"
        },
        "booksId2" : {
            "title" : "Harry Potter"
        }
    }
}

我知道我必须先获取users/randomUserId/books,然后循环dataSnapshot 结果以获取所有书籍ID。然后我必须通过使用指向books/bookId?/ 的数据库引用来请求每个书籍ID 的详细数据。像这样的:

rootRef.child("users/" + user.getUid() + "books").addListenerForSingleValueEvent(new ValueEventListener() {
    ... onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot bookIdSnapshot : dataSnapshot) {
            rootRef.child("books/" + bookIdSnapshot.getValue(String.class))
                .addListenerForSingleValueEvent(...) {
                    // here i get the book detail data
                }
        }
    }
    ...
}

但是使用该代码,每个rootRef.child("books/"...) 将单独执行。那么如何才能知道数据是否已经完全获取呢?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    实际上我们只需要一个intdouble 来指示是否完整地加载了所有相关数据,但我们也需要使用这些数据对吗?所以最好改用MapHashMap

    int bookTotalCount = -1;
    HashMap<String, Book> bookMap = new HashMap<String, Book>();
    
    rootRef.child("users/" + user.getUid() + "books").addListenerForSingleValueEvent(new ValueEventListener() {
        ... onDataChange(DataSnapshot dataSnapshot) {
            bookTotalCount = dataSnapshot.getChildrenCount();
            for (DataSnapshot bookIdSnapshot : dataSnapshot) {
                rootRef.child("books/" + bookIdSnapshot.getValue(String.class))
                    .addListenerForSingleValueEvent(new ValueEventListener() {
                        ... onDataChange(DataSnapshot dataSnapshot) {
                            Book book = dataSnapshot.getValue(Book.class);
                            bookMap.put(dataSnapshot.getKey(), book);
    
                            if (bookMap.size() == bookTotalCount) {
                                // you can place code here
                                // in here, all the related data will be completely loaded
                            }
                        }
                    });
            }
        }
        ...
    }
    

    注意:Book 是一个自定义对象,用于在 books/bookId? 中包含数据/值

    【讨论】:

      最近更新 更多