2017-02-04 29 views
1

firebaseデータベースを使用していますが、トランザクションに奇妙なエラーがあります。基本的に私は、パラメータの数と、このようなユーザリストで、「ユーザー」と呼ばれるキーを持っている:Unity Firebaseトランザクションエラー

"users" : { 
    "count" : 1, 
    "userList" : { 
    "LBBgLkOp3bWbZeSfnKVsqkHeW8s1" : true 
    } 
} 

私はカウントをインクリメントし、ユーザリストに現在のユーザーのIDを追加するためにトランザクションを使用しています。問題は、トランザクションが正常に完了しますが、すでに存在する場合、ユーザーはトランザクションが理由もなく失敗したキー(1回目)のキーのユーザ...

がない場合、私のコードは、この

void AddUserAndIncrementCount() 
{ 
    FirebaseDatabase.DefaultInstance.GetReference("users") 
     .RunTransaction(usersData => 
     { 
      Dictionary<string, object> users = usersData.Value as Dictionary<string, object>; 
      if (users == null) 
      { // firstTime 
       users = new Dictionary<string, object>(); 
       users.Add("count", 1); 
       users.Add("userList", new Dictionary<string, object>() { { auth.CurrentUser.UserId, true }}); 
      } 
      else 
      { 
       /* printing users returns this 
        {"count":1,"userList":{"LBBgLkOp3bWbZeSfnKVsqkHeW8s1":true}} 
       */ 
       // INCREMENT COUNT 
       users["count"] = int.Parse(users["count"].ToString()) + 1; 
       // ADD USER TO LIST 
       Dictionary<string, object> userList = users["userList"] as Dictionary<string, object>; 
       userList.Add(auth.CurrentUser.UserId, true); 
       users["userList"] = userList; 
      } 
      // END TRANSACTION 
      /* printing users returns this now 
       {"count":2,"userList":{"LBBgLkOp3bWbZeSfnKVsqkHeW8s1":true,"AM2vI8K106XghEgEgRSkCIpJn0w2":true}} 
      */ 
      usersData.Value = users; 
      return TransactionResult.Success(usersData); 
     }).ContinueWith(OnAddUserIncrementCountTask); 
} 

void OnAddUserIncrementCountTask(Task<DataSnapshot> task) 
{ 
    if (task.IsCompleted && !task.IsCanceled && !task.IsFaulted) 
    { 
     //Success 
    } 
    else 
    { 
     Debug.Log(task.IsFaulted+" - "+task.Exception.Message); 
     // True - Exception of type 'System.AggregateException' was thrown. 
    } 
} 
であるということです

ご覧のとおり、私が受け取っていたものを印刷して、トランザクションを送信して、すべてがうまく見えます。私はルールを公に設定しようとしました(真実を読んで真を書きます)、それも失敗したので、何か悪いことをしているのか、トランザクションに何か問題があるのか​​どうかわかりません。私のことを悩ませることは、ユーザーのキーがデータベースに存在しないと失敗しないので、私はそれが見えない何らかの奇妙な理由で失敗していると思うということです...

私はテストしていますAndroidデバイス。

ありがとうございます。

答えて

1

最終的に、トランザクションが失敗する原因を突き止めました。

ノードの既存の子または子の子の1つ、またはノード自体の値がブール値(true,)であると、トランザクションが失敗するバグがあるようです。

これを解決するために、trueブール値を"true"文字列に置き換えて、すべてのトランザクションが機能するようになりました。この記事は、このバグに実行し、次のいずれかのいくつかの時間を節約できます

auth.CurrentUser.UserId, "true" 

希望:

は、だから私の上記のコードでは、私は(これはコード内で2回表示)のための

auth.CurrentUser.UserId, true 

置き換えます。

+0

ここにFirebaseの開発者がいます。回避策を見つけてくれてありがとうJuanと私はこの問題についてお詫び申し上げます。これは、次のSDKリリース1.1.3で修正される予定です。 –

+0

こんにちは、問題はない、私はあなたのサポートチームにこれを1週間前に報告しました。それは私にとっては大きな問題ではありませんが、なぜ失敗したのかを理解することは困難でした。 Firebaseは素晴らしいです!良い仕事を保つ:) –

関連する問題