Android Firestore从多个位置获取集合

时间:2018-03-27 23:20:12

标签: java android firebase google-cloud-firestore

我开始了一个新项目。我正在尝试使用Firebase。我尝试将两个集合联合起来然后尝试将它们组合起来。

我的数据库结构:

  • 产品
    • [的productid]
      • 产品名: “测试名”
      • 价: “$ 17”
      • 用户ID:用户ID
  • 用户
    • [用户ID]
      • 名: “测试名”
      • 图像: “testimage.jpg”
      • 邮件: “test@gmail.com”

我的代码:

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,因为 用户数据来得晚。我该怎么做才能正确填写清单。

谢谢!

2 个答案:

答案 0 :(得分:0)

要解决此问题,请移动productModelList

的声明
final List<ProductModel> productModelList = new ArrayList<>();
在{for循环开始之前'onComplete()方法内部

。该列表也应该在该方法内部,否则它将为空,这是因为在您尝试将这些对象添加到列表之前调用的方法的异步行为。

为了更好地理解,我建议您从 post 以及 video 中看到我的答案。

答案 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);
                            }
                        } }});