2017-03-22 12 views
0

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) 
    } 
}) 
+1

これは予期された動作です。クライアントはまだその場所の値を知っていないので、あなたのトランザクションハンドラは(ほとんど)常に 'null'で呼び出されます。最初の推測として 'ヌル 'を使用することにより、トランザクションが単一の要求で成功することが可能になります。加藤の答えを見てください:http://stackoverflow.com/questions/28811037/data-in-transaction-is-nullまたはここに私:http://stackoverflow.com/questions/33578887/transcation-updatefunction-parameter-is-null/33578953#33578953 –

+0

@FrankvanPuffelenとても良いです。値がnullの場合はデータを設定し、Transaction.success(currentData)を返します。しかし、doTransactionメソッドは決して再び呼び出されず、値はFirebaseに決して設定されません。 [要点](https://gist.github.com/jacobattwobulls/136de48822da5caa0f0113d094425a77) – Jake

+0

私は何が起こっているのか分かりません。しかし、一般的には、スケーラビリティを損なうことになるので、JSONツリーでトランザクションを実行することをお勧めします。トランザクションを使用する代わりに、信頼できるプロセス(管理するサーバーや[Cloud Function](https://firebase.google.com/docs/functions/use-cases#perform_database_sanitization_and_maintenance)など)から複数の場所の更新を使用して、 )。 –

答えて

1

質問:データベースルート上でトランザクションを実行することは禁じられていますか?私はそれがどこに文書化されて見つけることはありませんが、答えははいと思われる。私は追加のデバッグログステートメントを持つあなたへのコードと同等(代わりにKotlinのJavaの)を実行すると

doTransaction()方法が繰り返し呼び出され、onComplete()は、トランザクションがあまりにも多くの再試行を持っていたのエラーを報告します。

rootの子にトランザクションの場所を変更すると、トランザクションは正常に完了します。

+0

私はそれほど恐れましたが、私は複数のより深いトランザクションを代わりに使用すると思います。 – Jake

関連する問題