我正在使用 Java 和 Firestore 在 Android Studio 上創建一個應用程式,該應用程式允許用戶發布并在帶有 RecyclerView 的 Fragment 上顯示它們。用戶創建一個組態檔(名稱、頭像),該組態檔保存在名為“Users”的集合中以用戶 UID 命名的檔案中。出版物被保存到另一個名為“帖子”(標題、內容、圖片、頭像、名稱)的集合中。
我寫了兩個查詢,一個從“帖子”集合中的帖子中獲取標題和內容,以及 UID,然后執行另一個查詢,從海報中獲取名稱和圖片,然后所有這些欄位都去在“Post”物件內并發送到填充 RecyclerView 的 ArrayList。
問題:帖子在 RecyclerView 上完美加載,但用戶圖片(我從不同集合中獲取的圖片)給我帶來了很多問題。有時它會加載,有時它不會加載,有時它只加載第一個帖子甚至前三個帖子。我不明白可能出了什么問題。我正在發布代碼:
private void loadPosts() {
Query postQuery = collectionReferencePosts.orderBy("timestamp", Query.Direction.DESCENDING);
postQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
for (QueryDocumentSnapshot document : task.getResult()) {
Post post = new Post();
post.setTitle(document.getString("title"));
post.setContent(document.getString("content"));
post.setImage(document.getString("image"));
String posterUid = document.getString("useruid");
DocumentReference docRef = collectionReferenceUsers.document(posterUid);
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
post.setName(documentSnapshot.getString("name").toString());
post.setAvatar(documentSnapshot.getString("image").toString());
}
});
postList.add(post);
postAdapter.notifyDataSetChanged();
}
}
});
}
uj5u.com熱心網友回復:
如果您想同時顯示帖子詳細資訊以及用戶詳細資訊,那么您必須在第二次獲取name和 的請求image完成時通知配接器有關更改。所以你必須移動以下兩行代碼:
postList.add(post);
postAdapter.notifyDataSetChanged();
緊接著:
post.setAvatar(documentSnapshot.getString("image").toString());
除此之外,您還應該考慮使用另一個選項,稱為denomalization。這意味著您可以在 post 檔案中添加用戶的name和image。這樣,就不需要執行第二次查詢了,因為所有的資料都已經存在于 post 檔案中了。如果您是 NoSQL 資料庫的新手,這聽起來可能有些奇怪,但我向您保證這是很常見的做法。
另請注意,這兩種解決方案都不比另一種更好。根據您的應用程式中可能發生的更改數量,關于名稱和用戶影像的更新,您必須檢查哪種解決方案更適合在您的專案中使用。
您還可以查看以下帖子,以更好地了解 Firebase API 的異步特性:
- 如何作為方法的結果回傳 DocumentSnapShot?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/484115.html
