java - 我应该如何获取文档字段并在另一个集合的另一个 map 中使用它们?

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

            }
        });

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

最佳答案

当您尝试使用以下代码行将用户名添加到postMap时:

postMap.put("username", username);

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

此问题的快速解决方案是将所有与向 postMap 添加数据相关的代码块移至 onComplete() 方法内。在这里,您正在等待回调,并且您的用户名将可用。否则我建议你看看我的答案的最后一部分 post 其中我解释了如何使用自定义回调来完成它。您还可以看看这个video 为了更好地理解。

关于java - 我应该如何获取文档字段并在另一个集合的另一个 map 中使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57448056/

相关文章:

java - 数据报包接收缓冲区大小-java

java - 如何从已通过 OAuth2 身份验证的服务器使用 C2DM 向设备发送消息?

android - RecyclerView.Adapter - 错误 : public functions exposes its internal return type in Kotlin

mysql - 使用 MySQL for Excel - 数据库中的一个特定表将无法导入,所有其他表都工作正常

java - 访问一个java文件中的另一个java文件

java - 在构造函数中调用可重写的方法

android - 如何为百度 map 生成API Key

单击搜索按钮时,Android ListView 滚动到底部

sql-server - 如何在没有 SQL Server Management Studio 的情况下使用 Microsoft SQL Server

mysql - 未知的内部查询错误