Android Unity Firebase事务错误
我正在使用firebase数据库,我在事务中遇到了一个奇怪的错误。基本上,我有一个名为“users”的键,其中包含一个参数计数和一个userlist,如下所示: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中。问题是,如果没有用户密钥(第一次),事务将成功完成,但如果已经有用户密钥,事务将无
"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"