处理indexedDB版本控制

k5ifujac  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(1)|浏览(304)

我有一个页面,其中包含基于哪个ID接收的数据,对于某些业务逻辑,我需要将这些值存储到indexDB中。
这是我在loadData页面上的代码

await createIndexDB(querystringID);

下面是我用来创建indexDB的代码:

const createIndexDB= async (ID) => {
    return new Promise(function (resolve, reject) {
        let isTrueInit = false;

        var dbReq = indexedDB.open('myindexDB', 1);

        dbReq.onerror = (e) => {
            myDB = dbReq.result
            myDB.close()
            reject({
                status: 'error',
                message: dbReq.error,
            })
        }

        dbReq.onsuccess = (event) => {
            const storeName = 'myindexDB' + ID;
            myDB = dbReq.result
            if (!myDB.objectStoreNames.contains(storeName)) {
                myDB.close()
                isTrueInit = true
                reject({
                    status: 'upgradeneeded',
                    message: "Store doesn't exist",
                    upgradeNeeded: true,
                    version: dbReq.result.version,
                    isTrueInit,
                })
            } else {
                myDB.onversionchange = (e) => {
                    // Close immediately to allow the upgrade requested by another
                    // instance to proceed.
                    myDB.close()
                }
                resolve({
                    db: myDB,
                    isTrueInit,
                })
            }
        }

        dbReq.onupgradeneeded = () => {
            const storeName = 'myindexDB' + ID;
            myDB = dbReq.result;
            if (!myDB.objectStoreNames.contains(storeName)) isTrueInit = true
            myDB.createObjectStore(storeName, { keyPath: 'itemid', autoIncrement: true })
        }

    });
}

然后,在loadData页面上,我执行一些函数来检索、设置和删除indexDB中的项,为此,我使用如下代码:

await getAllIndexDBItem(querystringID);

const getAllIndexDBItem = async (ID) => {
    return new Promise(function (resolve, reject) {
        var myDB = null;
        var dbReq = indexedDB.open('myindexDB', 1);

        dbReq.onsuccess = function (e) {
            myDB= dbReq.result;
            const transaction = myDB.transaction(['myindexDB' + ID], 'readonly');
            const store = transaction.objectStore('myindexDB' + ID);

            let request = store.getAll();

            request.onsuccess = event => {
                const result = request ? request.result : null;
                resolve(result);
            };

            transaction.onerror = event => {
                console.log('error getting element from myindexDB' + event.target.error);
                reject('error getting element from myindexDB ' + event.target.error);
            };

            transaction.oncomplete = event => {

            };
        }
    });
}

它使用我发送到loadData页面的第一个ID的所有内容都创建了indexDB和对象,但是当我发送另一个ID到loadData页面时,我得到了upgradeneeded错误消息。如果我更改此设置:

var dbReq = indexedDB.open('myindexDB', 1);

收件人:

var dbReq = indexedDB.open('myindexDB', 2);

现在,它可以在两个不同的ID下正常工作。所以我的问题是,我可以做些什么来正确处理indexDB的版本化,而不是手动更改版本?考虑到有时indexDB还不存在。

fivyi3re

fivyi3re1#

简短但没有帮助的回答是“你做错了”。你应该只在你的代码以及你对数据库的逻辑需求发生变化时才改变模式(添加/删除对象存储)。
一个更典型的方法是将ID包含在存储的键中,而不是考虑每个ID单独的对象存储。例如,使用[ID, other_key]作为存储中的键结构--一个复合键,其中包含要分区的ID,以及计划使用的任何其他键。
另一种选择是对每个ID使用完全不同的 database,每个数据库都有唯一的名称。每个这样的数据库都是相同的模式。例如,进行打开调用open('myDB-' + ID),并在每个数据库中使用相同的存储名称。

相关问题