Google Firestore设置值失败

时间:2020-02-14 13:15:39

标签: c# firebase unity3d google-cloud-firestore

我正在从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 \“:[]}”,那么我们将得到一个保存的记录。

2 个答案:

答案 0 :(得分:0)

因此,回答完我自己的问题后,我将在此记录下来,以供后代使用。

Firebase.Database.DatabaseReference.SetRawJsonValueAsync方法将不会写入任何指向空数组的成员,它们会被跳过,并且无提示地无法添加到数据库对象。 documentation中未提及,它指出:

将此位置的数据设置为给定的字符串json表示形式。

答案 1 :(得分:0)

使用数据库是不可能的(因为这是您删除数据的方式),但使用 Firestore 您可以IgnoreUndefinedProperties

但是,我认为这必须从 javascript/node 完成,因为在 Unity 中没有设置此项的条目。

const db = firestore.firestore();
db.settings({ ignoreUndefinedProperties: true })
相关问题