如何确保每个相关的Firebase数据都已完全加载?

时间:2017-02-25 14:35:45

标签: android firebase firebase-realtime-database

  

免责声明:我提出这个问题并自己回答,因为我需要一个“更大的董事会”来回答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/"...)将单独执行。那么如何才能知道数据是否已完全获得?

1 个答案:

答案 0 :(得分:0)

实际上我们只需要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?内包含数据/值而创建的自定义对象