免责声明:我提出这个问题并自己回答,因为我需要一个“更大的董事会”来回答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/"...)
将单独执行。那么如何才能知道数据是否已完全获得?
答案 0 :(得分:0)
实际上我们只需要int
或double
来指示是否已完全加载所有相关数据,但我们还需要正确使用这些数据吗?因此,最好使用Map
或HashMap
。
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?
内包含数据/值而创建的自定义对象