【问题标题】:Unity Firebase transaction errorUnity Firebase 事务错误
【发布时间】:2017-02-04 22:43:49
【问题描述】:

我正在使用 firebase 数据库,但交易出现了奇怪的错误。基本上我有一个名为“users”的键,带有一个参数计数和一个像这样的用户列表:

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

我使用事务来增加计数并将当前用户的 id 添加到 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.
    }
}

如您所见,我打印了交易中接收和发送的内容,一切似乎都很好。我尝试将规则设置为公开(读为真,写为真),但它也失败了,所以我不知道我是在做坏事还是交易有问题。困扰我的事情是,如果数据库中不存在用户密钥,那么它不会失败,所以我认为它失败的原因是一些我看不到的奇怪原因......

我正在 Android 设备上进行测试。

谢谢。

【问题讨论】:

    标签: android unity3d firebase firebase-realtime-database


    【解决方案1】:

    我终于找到了导致交易失败的原因。

    如果节点的现有子节点之一或子节点的子节点或节点本身的值是布尔值(truefalse),似乎存在导致事务失败的错误。

    为了解决这个问题,我只是将 true 布尔值替换为 "true" 字符串,现在所有事务都可以正常工作了。

    所以在我上面的代码中我替换了(这在代码中出现了两次)

    auth.CurrentUser.UserId, true
    

    为:

    auth.CurrentUser.UserId, "true"
    

    希望这篇文章可以为下一个遇到此错误的帖子节省一些时间。

    【讨论】:

    • Firebase 开发人员在这里。感谢您找到解决方法 Juan,我为这个问题道歉。这将在我们的下一个 SDK 版本 1.1.3 中修复。
    • 您好,没问题,我一周前向您的支持团队报告了这个问题,这对我来说不是什么大问题,但很难理解为什么它会失败。 Firebase 太棒了!保持良好的工作:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2020-09-19
    • 2021-01-13
    相关资源
    最近更新 更多