我必须更新我的代码,并通过将节点的值增加 1 来实现对节点的另一个子更新。我当前的代码如下所示(工作正常):
String key = database.child("rides").push().getKey();
Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("/rides/" + key, ride.toMap());
childUpdates.put("/ridesUser/" + ride.getUserID() + "/ownRides/" + key, ride.getTime());
database.updateChildren(childUpdates, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
}
});
添加增量代码的简单方法是:
childUpdates.put("/stations/" + ride.getFromID() + "/rideCount", fromStation.getRideCount() + 1);
但是,如果其他用户添加了此车站的行程,fromStation.getRideCount()
可能已经过时。
我读过几篇关于使用事务增加值的文章。如何将子更新和事务结合起来?我应该在 "/stations/"+ride.getFromID()
上运行事务,并在 doTransaction()
方法中更新我的 child 吗?这是原子性的吗?
最佳答案
如果您读过几篇文章,您可能已经看到了这一点:不可能将多位置更新和事务结合起来。
您的选择:
在树中的最低公共(public)级别执行事务
使用安全规则来实现多位置更新的伪交易。请参阅this answer from Kato或this more recent answer from me
从客户端写入“更改记录”,然后让服务器(不太可能面临争用)以事务方式执行更新。例如,请参阅我对此问题的回答:When should you use Firebase Transactions
关于firebase - 以原子方式更新多个节点并将值加 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39428856/