我开始了一个新项目。我正在尝试使用Firebase。我尝试将两个集合联合起来然后尝试将它们组合起来。
我的数据库结构:
我的代码:
public void getProductData(final FireCallback.Product fireCallback){
final List<ProductModel> productModelList = new ArrayList<>();
firestore.collection("products").get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
final ProductModel productModel = document.toObject(ProductModel.class);
final String userId = productModel.getUserId();
DocumentReference docRef = firestore.collection("users").document(userId);
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
productModel.setUserModel(documentSnapshot.toObject(UserModel.class));
}
});
productModelList.add(feedModel);
}
fireCallback.onProduct(productModelList);
} }});
我的用户模型迟到了。我无法设置productModel.setUserModel,因为 用户数据来得晚。我该怎么做才能正确填写清单。
谢谢!
答案 0 :(得分:0)
要解决此问题,请移动productModelList
:
final List<ProductModel> productModelList = new ArrayList<>();
在{for循环开始之前'onComplete()
方法内部。该列表也应该在该方法内部,否则它将为空,这是因为在您尝试将这些对象添加到列表之前调用的方法的异步行为。
答案 1 :(得分:0)
我编辑您的代码。希望对您有所帮助。
public void getProductData(final FireCallback.Product fireCallback){
final List<ProductModel> productModelList = new ArrayList<>();
firestore.collection("products").get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (final DocumentSnapshot document : task.getResult()) {
DocumentReference docRef = firestore.collection("users").document(userId);
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
final ProductModel productModel = document.toObject(ProductModel.class);
final String userId = productModel.getUserId();
productModel.setUserModel(documentSnapshot.toObject(UserModel.class));
}
});
productModelList.add(feedModel);
fireCallback.onProduct(productModelList);
}
} }});