如何测试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/