Firebaseデータベースを2つの場所で変更するためにFirebase Transactionを実行しようとしていますが、MutableDataはトランザクションが処理されます。FirebaseDatabaseルートリファレンスがトランザクションでnullです
データベースルート上でトランザクションを実行することは禁じられていますか?これを達成するには、複数の連鎖トランザクションを実行する必要がありますか?
val ref = FirebaseDatabase
.getInstance()
.getReference("/")
ref.runTransaction(object : Transaction.Handler {
override fun doTransaction(currentData: MutableData): Transaction.Result {
println(currentData) // { key = <none>, value = null }
if (currentData.value == null){
return Transaction.success(currentData)
}
currentData.child("users/{userID}/someVal/").setValue(X)
currentData.child("items/{itemID}/someVal/").setValue(Y)
return Transaction.success(currentData)
}
})
これは予期された動作です。クライアントはまだその場所の値を知っていないので、あなたのトランザクションハンドラは(ほとんど)常に 'null'で呼び出されます。最初の推測として 'ヌル 'を使用することにより、トランザクションが単一の要求で成功することが可能になります。加藤の答えを見てください:http://stackoverflow.com/questions/28811037/data-in-transaction-is-nullまたはここに私:http://stackoverflow.com/questions/33578887/transcation-updatefunction-parameter-is-null/33578953#33578953 –
@FrankvanPuffelenとても良いです。値がnullの場合はデータを設定し、Transaction.success(currentData)を返します。しかし、doTransactionメソッドは決して再び呼び出されず、値はFirebaseに決して設定されません。 [要点](https://gist.github.com/jacobattwobulls/136de48822da5caa0f0113d094425a77) – Jake
私は何が起こっているのか分かりません。しかし、一般的には、スケーラビリティを損なうことになるので、JSONツリーでトランザクションを実行することをお勧めします。トランザクションを使用する代わりに、信頼できるプロセス(管理するサーバーや[Cloud Function](https://firebase.google.com/docs/functions/use-cases#perform_database_sanitization_and_maintenance)など)から複数の場所の更新を使用して、 )。 –