有没有一种方法可以在RTDB的“transactions” API中进行“批量”写操作?(我们目前无法迁移到Firestore)
我们的问题如下:
当将新的“Job”对象写入服务器时,我们执行了三个连续的写操作:
- 使用GeoFire API编写位置键
- 编写工作
- 连接创建它的用户的Job ID
不幸的是,如果一个写操作失败但之前的一个写操作成功,它会导致系统出现严重错误。
我们正在寻找保证完成度或在写操作失败时撤销操作的方法。
有没有一种方法可以在RTDB的“transactions” API中进行“批量”写操作?(我们目前无法迁移到Firestore)
我们的问题如下:
当将新的“Job”对象写入服务器时,我们执行了三个连续的写操作:
不幸的是,如果一个写操作失败但之前的一个写操作成功,它会导致系统出现严重错误。
我们正在寻找保证完成度或在写操作失败时撤销操作的方法。
update()
方法进行“同时更新”。根据文档的详细说明,“同时更新……是原子性的:要么所有更新成功,要么所有更新失败。”请参阅文档的这一部分:https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields
请注意,实时数据库还提供将数据保存为事务的可能性,请参阅文档项此处和此处。但在您的情况下,使用同时更新可能就足够了。这里是我代码的一部分,仅供以后参考。(使用了Renaud的答案)
private void pushJob(Person person) {
DatabaseReference dataBase = FirebaseDatabase.getInstance().getReference();
GeoHash geoHash = new GeoHash(new GeoLocation(choosenLatLng.latitude,choosenLatLng.longitude));
Map<String, Object> geofireData = new HashMap<>();
geofireData.put("g", geoHash.getGeoHashString());
geofireData.put("l", Arrays.asList(choosenLatLng.latitude,choosenLatLng.longitude));
Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("/Geofire/" + job.getmJobUid(), geofireData);
childUpdates.put("/Jobs/" + job.getmJobUid(), job);
childUpdates.put("/Users/" + job.getPersonUid(), person);
dataBase.updateChildren(childUpdates).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
progressDialog.dismiss();
updateUI();
}
});
}