我正在使用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.
}
}
正如你所看到的,我打印了我收到的信息并在交易中发送,一切似乎都很好。我试图将规则设置为public(读取true并写入true),但它也失败了,所以我不知道我是做了什么坏事还是交易有问题。困扰我的是,如果用户密钥在数据库中不存在,那么它不会失败,所以我认为它失败了一些奇怪的原因,我看不到...
我正在Android设备上进行测试。
谢谢。
答案 0 :(得分:1)
我终于找到导致交易失败的原因。
如果节点的现有子节点之一或子节点的子节点或节点本身的值是布尔值(true
,{{1> }})。
为了解决这个问题,我刚刚为false
字符串替换了true
布尔值,现在所有交易都有效。
所以在上面的代码中我替换了(这在代码中出现了两次)
"true"
有:
auth.CurrentUser.UserId, true
希望这篇文章可以节省一些时间来运行这个bug。