2017-02-04 54 views
1

我正在使用Firebase數據庫,並且在事務中出現奇怪的錯誤。基本上,我已經叫關鍵「用戶」與參數計數和像這樣的用戶名單:Unity Firebase事務錯誤

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

我用交易來增加計數和當前用戶的ID添加到用戶列表。問題是,如果沒有一個用戶鍵(第一次)的交易完成成功地,但如果已經有一個用戶鍵入無故交易失敗...

我的代碼是這樣的

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. 
    } 
} 

正如你所看到的,我打印了我在交易中接收和發送的內容,一切看起來都很好。我試圖將規則設置爲public(讀取true和寫入true),並且它也失敗了,所以我不知道我是否做了不好的事情或者事務出了什麼問題。困擾我的事情是,如果用戶密鑰不存在於數據庫中,那麼它不會失敗,所以我認爲這是因爲一些奇怪的原因我無法看到失敗...

我正在測試一個Android設備。

謝謝。

回答

1

我終於發現是什麼導致交易失敗。

似乎有使交易失敗,如果該節點,或孩子的孩子,或者節點本身的價值存在的一個孩子是一個布爾(truefalse)的錯誤。

爲了解決這個問題,我剛剛替換了布爾值作爲"true"字符串,現在所有事務都可以使用。

所以在我上面的代碼我換成(這兩次出現在代碼)

auth.CurrentUser.UserId, true 

爲:

auth.CurrentUser.UserId, "true" 

希望這篇文章可以節省一些時間來運行這個bug下一個。

+0

Firebase開發者在這裏。感謝您找到解決方法Juan和我對此問題表示歉意。這將在我們的下一個SDK版本1.1.3中修復。 –

+0

你好,沒問題,我一週前向你的支持團隊彙報過,這對我來說不是一個大問題,但很難理解爲什麼它會失敗。 Firebase太棒了!保持良好的工作:) –