2017-02-04 13 views
1

Я использую базу данных firebase, и у меня есть странная ошибка с транзакциями. В основном я ключ называется «пользователи» с отсчетом параметров и список пользователей, как это:Ошибка транзакции Unity Firebase

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

Я использую транзакцию, чтобы увеличить количество и добавить идентификатор текущего пользователя к USERLIST. Проблема заключается в том, что если нет ключа пользователей (в первый раз) сделка завершает успешно, но если уже есть пользователи ключевой сделка не может без причины ...

Моего кода это

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

Как вы можете видеть, я печатал то, что получаю и отправляю транзакцию, и все кажется прекрасным. Я пытался установить правила для публики (прочитал true и написал true), и он также потерпел неудачу, поэтому я не знаю, делаю ли я что-то плохое или что-то не так с транзакциями. Меня беспокоит то, что, если ключ пользователя не существует в базе данных, он не терпит неудачу, поэтому я думаю, что он не работает по какой-то странной причине, я не вижу ...

Я тестирую на Android-устройство.

спасибо.

ответ

1

Я, наконец, нашел, что привело к сбою транзакции.

Похоже, что существует ошибка, из-за которой транзакции терпят неудачу, если один из существующих дочерних узлов узла или дочерние элементы дочернего элемента или значение самого узла являются логическими (true, false).

Чтобы решить эту проблему, я только что заменил строку true boolean на строку "true", и теперь все транзакции работают.

Так что в моем коде выше я заменил (это дважды появляется в коде)

auth.CurrentUser.UserId, true 

для:

auth.CurrentUser.UserId, "true" 

Надеется, что это сообщение экономит время на следующем работает с этой ошибкой.

+0

Firebase разработчик здесь. Спасибо, что нашли обходной путь Хуан, и я приношу свои извинения за этот вопрос. это будет исправлено в следующем выпуске SDK 1.1.3. –

+0

Привет, без проблем, я сообщил об этом неделю назад вашей команде поддержки. Это не большая проблема для меня, но было трудно понять, почему она терпит неудачу. Огненная база потрясающая! Сохраняйте хорошую работу :) –

Смежные вопросы