2016-09-10 35 views
2

我必須更新我的代碼,並通過將其值增加1來實現對節點的另一個子更新。我當前的代碼如下所示(工作正常):以原子風格更新多個節點並將值增加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()方法中更新我的孩子嗎?這是原子性的嗎?

回答

3

如果您已閱讀過多篇文章,您可能已經看到了這一點:無法將多位置更新和事務組合在一起。

您的選擇:

  1. 樹做的最低通用級別交易

  2. 使用安全規則來實現您的多位置更新僞交易。請參閱this answer from Katothis more recent answer from me

  3. 從客戶端寫入「更改記錄」,然後讓服務器(不太可能面臨爭用)以事務方式執行更新。例如,看我對這個問題的回答:When should you use Firebase Transactions