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

时间:2018-01-27 21:01:15

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

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

我认为使用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();

中遇到此错误
  

无法解析构造函数

有没有其他方法可以检查文件是否存在? 我编写了AsyncTask错误吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

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

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

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