Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Unity Firebase事务错误_Android_Unity3d_Firebase_Firebase Realtime Database - Fatal编程技术网

Android Unity Firebase事务错误

Android Unity Firebase事务错误,android,unity3d,firebase,firebase-realtime-database,Android,Unity3d,Firebase,Firebase Realtime Database,我正在使用firebase数据库,我在事务中遇到了一个奇怪的错误。基本上,我有一个名为“users”的键,其中包含一个参数计数和一个userlist,如下所示: "users" : { "count" : 1, "userList" : { "LBBgLkOp3bWbZeSfnKVsqkHeW8s1" : true } } 我使用一个事务来增加计数,并将当前用户的id添加到userList中。问题是,如果没有用户密钥(第一次),事务将成功完成,但如果已经有用户密钥,事务将无

我正在使用firebase数据库,我在事务中遇到了一个奇怪的错误。基本上,我有一个名为“users”的键,其中包含一个参数计数和一个userlist,如下所示:

"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.
    }
}
void AddUserAndIncrementCount()
{
FirebaseDatabase.DefaultInstance.GetReference(“用户”)
.RunTransaction(usersData=>
{
Dictionary users=usersData.Value作为Dictionary;
如果(用户==null)
{//第一次
用户=新字典();
用户。添加(“计数”,1);
Add(“userList”,new Dictionary(){{auth.CurrentUser.UserId,true}});
}
其他的
{
/*打印用户返回此
{“count”:1,“userList”:{“LBBgLkOp3bWbZeSfnKVsqkHeW8s1”:true}
*/
//增量计数
users[“count”]=int.Parse(users[“count”].ToString())+1;
//将用户添加到列表
Dictionary userList=用户[“userList”]作为字典;
添加(auth.CurrentUser.UserId,true);
用户[“用户列表”]=用户列表;
}
//结束交易
/*打印用户现在返回这个
{“count”:2,“userList”:{“LBBgLkOp3bWbZeSfnKVsqkHeW8s1”:true,“am2vi8k106xghegeggrskcipjn0w2”:true}
*/
usersData.Value=用户;
返回TransactionResult.Success(usersData);
}).ContinueWith(OnAddUserIncrementCountTask);
}
无效OnAddUserIncrementCountTask(任务任务)
{
if(task.IsCompleted&&!task.IsCanceled&&!task.IsFaulted)
{
//成功
}
其他的
{
Debug.Log(task.IsFaulted+“-”+task.Exception.Message);
//True-引发了类型为“System.AggregateException”的异常。
}
}
正如你所见,我在交易中打印了我接收和发送的内容,一切似乎都很好。我试图将规则设置为public(read-true和write-true),但也失败了,所以我不知道我是否做了坏事,或者交易是否有问题。困扰我的是,如果数据库中不存在用户密钥,那么它不会失败,所以我认为它失败的原因很奇怪,我看不出来

我正在安卓设备上测试


谢谢。

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

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

为了解决这个问题,我将
true
布尔值替换为
“true”
字符串,现在所有事务都可以工作了

因此,在我上面的代码中,我替换了(这在代码中出现了两次)

用于:


希望这篇文章能为下一篇运行此bug的文章节省一些时间。

Firebase开发者在此。谢谢你找到一个解决办法,我为这个问题道歉。这将在我们的下一个SDK版本1.1.3中修复。您好,没问题,我在一周前向您的支持团队报告了这一点,这对我来说不是一个大问题,但很难理解为什么失败。Firebase太棒了!保持良好的工作:)
auth.CurrentUser.UserId, true
auth.CurrentUser.UserId, "true"