我的目标是在单击按钮时将名称插入 Cloud Firestore 中,但如果用户未连接到互联网,我不希望保存处于挂起状态。我不喜欢 Firebase 保存待处理写入的行为,即使互联网连接已恢复。
我研究发现Firebase 开发人员建议使用事务 https://stackoverflow.com/questions/54308344/how-can-i-discard-pending-documentreference-writes-when-offline/54308526#54308526以防止在没有互联网时挂起的写入操作。我已经尝试过了,但结果仍然相同:如果没有互联网,它会保存待处理的写入,当互联网连接恢复时,它会重写到Firestore。为什么交易没有按预期进行?
HashMap < String, Object > hashMap = new HashMap < > ();
hashMap.put("Name", "Test");
FirebaseFirestore.getInstance().batch().set(FirebaseFirestore.getInstance().collection("LISTS").document(), hashMap).commit().addOnCompleteListener(new OnCompleteListener < Void > () {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(MainActivity.this, "" + task, Toast.LENGTH_SHORT).show();
if (task.isSuccessful())
activityMainBinding.activityMainMaterialToolbarTopBar.setTitle("Done");
else
activityMainBinding.activityMainMaterialToolbarTopBar.setTitle(task.getException().getMessage());
}
});
我的时间很紧,因为我想在指定的日期将这个项目交付给公司,我不想浪费时间。如果无法通过交易解决问题,请告诉我,以便我寻找替代解决方案。
当你使用时FirebaseFirestore#batch() https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/FirebaseFirestore#batch()您不是在执行交易,而是在创建写批处理 https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/WriteBatch:
创建一个写入批处理,用于将多个写入作为单个原子操作执行。
因此,这是一个原子操作而不是事务。如果您需要进行交易,请查看以下官方文档:
- https://firebase.google.com/docs/firestore/manage-data/transactions#transactions https://firebase.google.com/docs/firestore/manage-data/transactions#transactions
所以你应该使用FirebaseFirestore#runTransaction() https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/FirebaseFirestore#runTransaction(com.google.firebase.firestore.Transaction.Function%3CTResult%3E) which:
执行给定的 updateFunction,然后尝试提交在事务中应用的更改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)