繁体   English   中英

等待 Cloud Firestore 任务结果

[英]Wait for Cloud Firestore task result

我正在尝试开发一种访问 Cloud Firestore、读取用户数据并返回与其关联的 map 的方法。 据我了解,它不是在等待成功/失败侦听器,我已经尝试将其更改为完整的侦听器,但结果是相同的。 它跳过听众。 我知道这是一个异步过程,但我需要接收数据以在调用该方法的 Activity 上显示它们。

设置活动:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.binding = ActivitySettingsBinding.inflate(getLayoutInflater());
        this.fbUtils = new FirebaseHandler(this);
        setContentView(binding.getRoot());

    }

    @Override
    protected void onStart() {
        super.onStart();
        User user = fbUtils.getCurrentUser();
        if (user == null) {
            findUserOrLogout();
        } else {
            showUserData(user);
        }
    }

FirebaseHandler

    public User getCurrentUser() {
        FirebaseUser user = auth.getCurrentUser();
        if (user != null) {
            this.userMap = getUserDBInfo(user.getUid());
            this.profilePic = getUserPic(user.getUid());
            if (this.userMap != null && this.profilePic != null) {
                return new User(user, userMap, profilePic);
            }
        }
        return null;
    }
    
    private Map<String, Object> getUserDBInfo(String uid) {
        Log.d(TAG, "Getting user info for user '" + uid+"'");
        DocumentReference docRef = db.collection("users").document(uid);
        final Map<String, Object>[] userMap = new Map[]{null};
        final boolean[] done = new boolean[]{false};
        docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) {
                if (documentSnapshot.exists()) {
                    Log.d(TAG, "DocShot: " + documentSnapshot);
                    userMap[0] = documentSnapshot.getData();
                } else {
                    Log.d(TAG, "User's document not found");
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.d(TAG, "Couldn't get the Document");
                MainActivity.showToast("Couldn't get the Document", activity.getApplicationContext());
            }
        });
        return userMap[0];
    }

我在我的代码中做错了什么,或者我可以改变什么来使这项工作?

提前致谢。

您必须更改 Firebase 控制台内的规则以允许写入操作。

您必须按照以下步骤进行操作:-

  1. 打开您的 Firebase 控制台并导航到数据库。

  2. 有 go 到“规则”选项卡并将规则编辑为以下内容:-

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

这将允许您对数据库执行写操作。

如果您需要屏幕截图,请告诉我。

如果您的数据库需要经过身份验证的用户来读取和写入数据库,那么请在此处使用其他答案。 它将创建一个巨大的安全漏洞,允许任何有互联网连接的人完全读取和写入数据库。

相反,您的代码应确保用户在尝试进行任何查询之前已登录。 这可以通过使用身份验证 state 侦听器在用户登录时获取回调来实现。只有在使用有效用户 object 调用此回调之后,才能安全地进行需要身份验证的查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM