【发布时间】:2018-05-19 18:46:40
【问题描述】:
我正在尝试检查保存在数据库中的值是否与用户选择匹配,如果匹配则更新它,否则不执行任何操作。
我尝试了以下方法,但出现异常:
原因:com.google.firebase.firestore.FirebaseFirestoreException:事务中读取的每个文档也必须写入。
这是我的代码:
//update toolbar titles if they match
final DocumentReference adminDocRef = mDbase.collection("admins").document(adminID);
mDbase.runTransaction(new Transaction.Function<Void>() {
@Override
public Void apply(@NonNull Transaction transaction) throws FirebaseFirestoreException {
DocumentSnapshot adminSnapshot = transaction.get(adminDocRef);
String toolbarTitle = adminSnapshot.getString("displayedUser");
if (userName.equals(toolbarTitle)) {
transaction.update(adminDocRef, "displayedUser", userName);
}
// Success
return null;
}
})
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "Transaction success!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Transaction failure.", e);
}
});
交易可以有条件吗?如果不是,你将如何解决这个问题?必须做一个单独的 get 然后在其中嵌套一个更新似乎很愚蠢。
任何帮助将不胜感激。
谢谢!
【问题讨论】:
-
你试过在查询之外添加条件吗?
-
感谢阿姆的反馈。你能更具体一点吗?条件基于我要更新的字段中当前的内容。我能看到这样做的唯一方法是在字段上执行单独的查询/get(),然后根据结果执行事务,但这似乎否定了事务的使用开始......在那种情况下,我我想我会定期更新。
标签: android firebase transactions google-cloud-firestore