トランザクションを使うことでインクリメントを実現することができます。
// サンプルモデル counterをインクリメントする
class Hoge {
var counter: Long? = null
}
// インクリメント実装例
fun incrementExample() {
val ref = realtimeDatabase.getReference("hoge")
ref.runTransaction(object : Transaction.Handler {
override fun onComplete(p0: DatabaseError?, p1: Boolean, p2: DataSnapshot?) {
if (p0 == null) {
info { "Transaction success:${p2?.toString()}" }
} else {
error { p0 }
}
}
override fun doTransaction(p0: MutableData): Transaction.Result {
val hoge = p0.getValue(Hoge::class.java)
?: Hoge().apply { counter = 0 }
hoge.counter = (hoge.counter ?: 0) + 1
p0.value = hoge
return Transaction.success(p0)
}
})
}
トランザクション内で値の取得&更新を行います。
実行中に別の端末などから書き込みがある場合はトランザクションが一度失敗し再試行されます。
試行回数には上限があるらしいので絶対とは言えませんが、更新頻度次第ではかなり有用なインクリメント方法です。
参考
https://firebase.google.com/docs/database/android/read-and-write#save_data_as_transactions