以原子样式更新多个节点并将值增加1

时间:2016-09-10 17:42:44

标签: firebase firebase-realtime-database

我必须通过将其值增加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()方法中更新吗?这是原子的吗?

1 个答案:

答案 0 :(得分:3)

如果您已阅读过多篇帖子,您可能已经看过这个帖子:无法将多位置更新和交易结合起来。

您的选择:

  1. 在树的最低公共级别执行交易

  2. 使用安全规则为您的多位置更新实施伪事务。请参阅this answer from Katothis more recent answer from me

  3. 写下&#34;更改记录&#34;从客户端然后让服务器(不太可能面临争用)以事务方式执行更新。例如,请参阅我对此问题的回答:When should you use Firebase Transactions