我应该如何获取文档字段并将其在另一个地图中用于另一个集合?

时间:2019-08-11 07:19:11

标签: java android database firebase google-cloud-firestore

我应该如何从一个集合中获取文档字段并将其组合以将新文档添加到另一个集合中?我已经附加了数据库的picture的外观,我想从收藏夹展示中获取字段,并希望将其与其他一些数据一起更新到新收藏夹:

private void savePost(String mPostTitle, String mPostContent, String mlistSpinnerC) {
        final DocumentReference docRef = FirebaseFirestore.getInstance().collection("users").document(mauth.getCurrentUser().getUid());
        docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    DocumentSnapshot document = task.getResult();
                    if (document != null) {
                        String username = (String) 
document.get("username");
String email= (String) document.get(email);
                    } else {
                        Log.d(TAG, "No such document");
                    }
                } else {
                    Log.d(TAG, "get failed with ", task.getException());
                }
            }
        });

        postMap.put(Constants.POSTTTITLE, mPostTitle);
        postMap.put(Constants.POSTCATEGORY, mlistSpinnerC);
        postMap.put(Constants.POSTCONTENT, mPostContent);
        postMap.put(Constants.TIMESTAMP, (System.currentTimeMillis()/1000));
        postMap.put(Constants.USER_ID,mauth.getCurrentUser().getUid());
        postMap.put("username", username);


        PostsRef.document().set(postMap).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {

                if(task.isSuccessful()){
                    Intent toHomeActivity = new Intent(AddPostActivity.this, MainActivity.class);
                    startActivity(toHomeActivity);
                }

            }
        });

我只是无法将字段从一个集合映射到另一个集合,请为我提供正确的方法。

1 个答案:

答案 0 :(得分:0)

在您尝试使用以下代码行将username添加到postMap时:

postMap.put("username", username);

数据尚未完成从数据库的加载,这是因为在查询完成之后,您已经添加到get()调用中的侦听器将被调用一段时间。您不知道要花多长时间,可能需要几百毫秒到几秒钟的时间才能获得该数据。 onComplete()方法具有异步行为,这就是为什么您无法以这种方式获得该username的原因。

此问题的快速解决方案是将所有与向postMap添加数据有关的代码块移至onComplete()方法内。在此,您正在等待回调,并且username将可用。否则,我建议您从此 post 中查看ananser的最后一部分,其中我已经解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。