繁体   English   中英

Unity Firebase 事务错误

[英]Unity Firebase transaction error

我正在使用 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 设备上进行测试。

谢谢你。

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

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

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

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

auth.CurrentUser.UserId, true

为了:

auth.CurrentUser.UserId, "true"

希望这篇文章可以为下一个运行此错误的文章节省一些时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM