Ionic 3存储集并发挥作用

时间:2018-11-16 12:14:25

标签: ionic3 ionic-storage

我有一个Ionic 3应用程序,在其中将对象数组存储在SQLite中。

我的this.data数组(在下半部分说明)如下所示:

[
    {
        guid: "xy",
        images: [
            { guid: 0, uploaded: true },
            { guid: 1, uploaded: true }
        ],
    },
    {
        guid: "xz",
        images: [
            { guid: 0, uploaded: false },
            { guid: 1, uploaded: false }
        ],
    }
]

所以一个对象又有一个GUID和一个对象数组。项目更新后,我想将所有项目保存到存储以及上载器类的变量中。 Uploader类具有this.data和this.key属性。

这是有问题的部分的片段:

updateItem(value){
    // search for the index of the item in the array
    var index = this.data.findIndex((item) => {
        return item.guid == value.guid;
    });

    if(index >= 0){
        // update the item in the array with the changed one
        this.data[index] = value;

        // this works fine, prints with the updated item
        console.log(this.data);

        // it supposed to save the whole array with the changed items
        return this.storage.set(this.key, this.data).then(() => {

            // for debug I read the data again - same happens after app restart
            this.storage.get(this.key).then((data) => {
                // this logs the initial, unchanged items
                console.log(data);
            });
        });
    }

    return Promise.reject(new Error('error'));
}

首先,它在this.data数组中搜索该项的索引(如果找到),然后覆盖该数组中的该项。 然后尝试将其保存到存储中。 出于调试目的,我阅读了存储并进行console.log。

将“ xz”对象的图像设置为uploaded = true之后,我将调用updateItem(secondItem)

从第一个console.log开始,我看到“ xy”和“ xy”对象的图像全部上传:true。调用storage.set,并在storage.get内发生初始状态。 “ xy”对象的图像已上传:true,但“ xz”对象的图像为false。 重新启动应用程序后,此状态会再次加载。

如果this.data中只有一个对象,则updateItem可以正常工作,例如,我将存储设置为upload:false,然后更改属性,然后调用updateItem(firstItem),它将保存上传状态。但是,如果数组中有多个对象,则只会保存一个。

我尝试将其保存为JSON,并在读回时进行解析,但结果相同。

1 个答案:

答案 0 :(得分:0)

我最终克隆了阵列,然后保存了克隆,然后将克隆分配给原始阵列。这解决了我的问题。

updateItem(value){
    // search for the index of the item in the array
    var index = this.data.findIndex((item) => {
        return item.guid == value.guid;
    });

    var newData = this.data.slice();

    if(index >= 0){
        // update the item in the array with the changed one
        newData[index] = value;

        // it supposed to save the whole array with the changed items
        return this.storage.set(this.key, newData).then(() => {
            this.data = newData;

            // for debug I read the data again - same happens after app restart
            this.storage.get(this.key).then((data) => {
                // this logs the initial, unchanged items
                console.log(data);
            });
        });
    }

    return Promise.reject(new Error('error'));
}