如何测试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错误吗?
感谢您的帮助
答案 0 :(得分:2)
你说&#34;可用时没有及时更新&#34;。听起来你正在寻找一些关于何时调用你的回调的保证。这几乎肯定是一个坏主意,因为任何因素都可能会延迟您的应用和Firestore之间的数据往返。
另外,请记住get()方法(以及所有Firestore查询操作)都是异步的。在任何工作完成之前,他们会立即返回。这意味着您有义务使用回调(或任务)来确定数据何时可用。任何依赖于usable
变量的代码都需要仅在响应该回调时触发。
如果您想了解如何更好地使用Firebase API生成的Task对象read my blog series。