我正在从Unity应用程序编写-这不是身份验证问题,因为我尝试过使用开放数据库和受限数据库。用户已通过身份验证,我已经在每个步骤中检查了代码,并且看到了除原始变量(设置为“ {}”而原始变量除外)之外的所有变量的期望值,而initialUser as JSON是{“ inventory”:[] ,“保存”:[]}
private void InitialiseUser(FirebaseUser user, Action<bool> callback) {
LoadJsonAsset<UserData>("initialise/user", initialUser => {
if (initialUser != null) {
userDataRef.SetRawJsonValueAsync(JsonUtility.ToJson(initialUser)).ContinueWithOnMainThread(task => {
if (task.IsCompleted) {
userDataRef.GetValueAsync().ContinueWithOnMainThread(getTask => {
var raw = getTask.Result.GetRawJsonValue();
userSnapshot = getTask.Result;
callback(getTask.IsCompleted);
});
} else {
Debug.LogError("Unable to set initial user data");
callback(false);
}
});
} else {
Debug.LogError("Unable to initialise user");
callback(false);
}
});
}
减少问题,使其更清晰一些:
const string setRaw = "{\"inventory\":[],\"saves\":[]}";
userDataRef.SetRawJsonValueAsync(setRaw).ContinueWithOnMainThread(setTask => {
if (setTask.IsCompleted) {
userDataRef.GetValueAsync().ContinueWithOnMainThread(getTask => {
var getRaw = getTask.Result.GetRawJsonValue();
Debug.Assert(getRaw == setRaw);
});
}
});
我看到的是getRaw设置为“ {}”。看来,如果您的成员是空数组,则它们将被静默地从存储的数据中删除,因此整个写入都将静默失败。
例如,如果setRaw设置为“ {\” inventory \“:[\” test \“],\” saves \“:[]}”,那么我们将得到一个保存的记录。
答案 0 :(得分:0)
因此,回答完我自己的问题后,我将在此记录下来,以供后代使用。
Firebase.Database.DatabaseReference.SetRawJsonValueAsync方法将不会写入任何指向空数组的成员,它们会被跳过,并且无提示地无法添加到数据库对象。 documentation中未提及,它指出:
将此位置的数据设置为给定的字符串json表示形式。
答案 1 :(得分:0)
使用数据库是不可能的(因为这是您删除数据的方式),但使用 Firestore 您可以IgnoreUndefinedProperties
。
但是,我认为这必须从 javascript/node 完成,因为在 Unity 中没有设置此项的条目。
const db = firestore.firestore();
db.settings({ ignoreUndefinedProperties: true })