【发布时间】: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