Firebase(Unity)RTDB更新节点数据问题



如果我使用Unity更新Firebase RTDB中的节点,并传入RunTransaction:

Dictionary<string, object> newData = new Dictionary<string, object>();
newData["key_a"] = "val_a";
newData["key_b"] = "val_b";
newData["key_c"] = "val_c";
mutableData.Value = newData;

在节点已经具有"0"的情况下;key_d";其值为"0";val_d";RTDB似乎用传递给它的新数据替换了整个节点;key_d";。

我的理解是;key_a"key_b"key_c";将被添加,但是";key_d";将保留在节点上。

当我在编辑器中测试这一点时,这似乎是真的,但在真实的设备上,它似乎只覆盖了整个节点;key_a"key_b"key_c";。

在Firebase RTDB安全规则中;newData表示正在写入的新数据和现有数据的合并结果"我也有一些规则,这些规则同样适用于编辑器,但不适用于设备。

也就是说,我使用:
"验证写入;。验证":"newData.hasChildren(['key_a','key_b','key_c','key_d'](">

  • 团结:2021.3.9f1
  • Firebase:9.4.0

在设备上进行了测试,没有任何错误,编辑器和设备中的所有数据都正常发布,并进行了日志记录。在RTDB规则操场中测试,传入的数据表现如预期,添加了新密钥,但保留了旧密钥。

如有任何帮助或澄清,我们将不胜感激。

编辑:附加代码:

db_reference
.Child("node")
.RunTransaction(RunTransaction)
.ContinueWithOnMainThread(task => {
if (task.Exception != null) {
Debug.Log("Transaction exception.");
} else if (task.IsCompleted) {
Debug.Log("Transaction complete.");
}
});
TransactionResult RunTransaction(MutableData mutableData) {
List<object> data = mutableData.Value as List<object>;
if (data != null) {
Dictionary<string, object> newData = new Dictionary<string, object>();
newData["key_a"] = "val_a";
newData["key_b"] = "val_b";
newData["key_c"] = "val_c";
mutableData.Value = newData; // this is where the node is overridden and the root of the question / clarification
} else {
Dictionary<string, object> newData = new Dictionary<string, object>();
newData["key_a"] = "val_a";
newData["key_b"] = "val_b";
newData["key_c"] = "val_c";
newData["key_d"] = "val_d";
mutableData.Value = newData;
}
return TransactionResult.Success(mutableData);
}

为了解决这个问题,我从mutableData中获取所有当前数据!=null,并将其与我希望更新的任何新数据相结合。

然后将带有newData的mutableData返回到返回的TransactionResult.Success(mutableData(中,并且一切正常。

如果保存的mutableData缺少任何当前数据,则该数据将丢失。

相关内容

  • 没有找到相关文章

最新更新