android - 如何测试firestore中的文档是否存在?

标签 android firebase android-asynctask google-cloud-firestore

如何测试firestore中的文档是否存在?

我想测试firestore中是否存在文档,我尝试了以下方法:

mDocRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) {
                Settings activity = activityReference.get();
                if (documentSnapshot.exists()) {
                    usable = false;
                    Log.d("checkIfUsable", String.valueOf(usable));
                } else {
                    usable = true;
                    Log.d("checkIfUsable", String.valueOf(usable));
                }
            }
        });

我可以在日志中看到该消息,但变量usable没有及时更新。此后的代码应在完成文档存在性测试后执行。

我认为使用 AsyncTask 可能会起作用,但事实并非如此。这是我所做的:

private static class checkIfUsable extends AsyncTask<String, Void, Void> {

    private WeakReference<Settings> activityReference;
    // only retain a weak reference to the activity
    checkIfUsable(Settings context) {
        activityReference = new WeakReference<>(context);
    }

    private WeakReference<Application> appReference;

    checkIfUsable(Application context) {
        appReference = new WeakReference<>(context);
    }

    @Override
    protected Void doInBackground(String... strings) {

        DocumentReference mDocRef = FirebaseFirestore.getInstance().document("savedSampleData/" + Arrays.toString(strings));

        mDocRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) {
                Settings activity = activityReference.get();
                if (documentSnapshot.exists()) {
                    activity.usable = false;
                    Log.d("checkIfUsable", String.valueOf(activity.usable));
                } else {
                    activity.usable = true;
                    Log.d("checkIfUsable", String.valueOf(activity.usable));
                }
            }
        });
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        Settings activity = activityReference.get();
        if (activity.usable) {
            final SharedPreferences sharedPreferences = activity.getSharedPreferences(SETTINGS_SHARED_PREF_FILE_KEY, Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString(PERSONAL_SAMPLE_CODE_KEY, String.valueOf(activity.text));
            editor.apply();
            activity.update();
        } else {
            Toast.makeText(appReference.get(), R.string.something_went_wrong_check_internet_or_use_other_code, Toast.LENGTH_LONG).show();
        }
    }
}

我在构造函数中遇到此错误new checkIfUsable().execute();

cannot resolve constructor

还有其他方法来检查文档是否存在吗? 我的 AsyncTask 代码是否错误?

感谢您的帮助

最佳答案

你说“可用的没有及时更新”。听起来您正在寻找有关回调何时被调用的一些保证。这几乎肯定是一个坏主意,因为许多因素都可能延迟您的应用和 Firestore 之间的数据往返。

此外,请记住 get() 方法(以及所有 Firestore 查询操作)是异步的。他们将在任何工作完成之前立即返回。这意味着您必须使用回调(或任务)来确定数据何时可用。任何依赖于您的 usable 变量的代码都需要仅在响应该回调时触发。

如果您想了解如何更好地使用 Firebase API 生成的任务对象,read my blog series .

关于android - 如何测试firestore中的文档是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48480533/

相关文章:

android - 从互联网加载图像后,Viewpager 不包装内容

java - sharedpreference 不保存/加载数据

firebase - 使用 Firebase 函数将发布的表单图像缓冲区上传到 Cloud Storage

java - Android - AsyncTask 中的 setAdapter()

java - 如何在 doInBackground asynctask 中放入 2 个参数?

java - AsyncTask onCancelled(Object) 在 asyncTask.cancel(true) 之后从未调用过;

Android Lollipop 在USB OTG中创建一个文件夹

firebase - Flutter Cloud Firestore 插件 : How reject a transaction?

android - 如何在 addChildEventListener 中计算 child 数?

java - onPostExecute 被调用两次并显示双倍结果