有没有办法在RTDB中操作事务API进行“批量”写入?(我们目前无法迁移到Firestore)
我们的问题如下:
在向服务器写入新的“Job”对象时,我们正在执行三个连续写入:
不幸的是,如果其中一个写入失败但前一个写入成功,则会导致系统出现重大错误 我们正在寻找确保完整性的方法,或者在其中一个写入失败时恢复操作。
答案 0 :(得分:2)
如果仅仅是写和"确保完整性,或者如果其中一个写入失败而恢复操作",您可以使用同步更新使用update()
方法。
如文档中所详述,"同步更新....是原子的:要么所有更新都成功,要么所有更新都失败。"。请参阅文档的这一部分:https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields
请注意,实时数据库还提供了将数据保存为事务的可能性,请参阅文档项here和here。但是,在您的情况下,使用同步更新可能就足够了。
答案 1 :(得分:1)
以下是我的代码中的代码段,仅供将来参考。 (使用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();
}
});
}