首页 > 解决方案 > 我应该如何获取文档字段并将它们用于另一个地图的另一个集合?

问题描述

我应该如何从一个集合中获取文档字段并将它们组合起来以将新文档添加到另一个集合?我附上了数据库的图片,它看起来如何,我想从集合显示中获取字段,并希望将其与其他一些数据一起更新到新集合:

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

            }
        });

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

标签: javaandroiddatabasefirebasegoogle-cloud-firestore

解决方案


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

postMap.put("username", username);

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

快速解决此问题的方法是将所有与将数据添加到方法postMap内的 ,相关的代码块onComplete()。在这种情况下,您正在等待回调并且username您将可用。否则,我建议您从这篇文章中查看我的 anwser 的最后一部分,其中我已经解释了如何使用自定义回调来完成它。您也可以观看此视频以更好地理解。


推荐阅读