我正在尝试使用indexedDB存储一些应用程序数据
这是我的代码
function _getLocalApplicationCache(_, payload) {
const indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.shimIndexedDB;
if (!indexedDB) {
if (__DEV__) {
console.error("IndexedDB could not found in this browser.");
}
}
const request = indexedDB.open("ApplicationCache", 1);
request.onerror = event => {
if (__DEV__) {
console.error("An error occurred with IndexedDB.");
console.error(event);
}
return;
};
request.onupgradeneeded = function () {
const db = request.result;
const store = db.createObjectStore("swimlane", {keyPath: "id", autoIncrement: true});
store.createIndex("keyData", ["name"], {unique: false});
};
request.onsuccess = () => {
// creating the transition
const db = request.result;
const transition = db.transaction("swimlane", "readwrite");
// Reference to our object store that holds the swimlane data;
const store = transition.objectStore("swimlane");
const swimlaneData = store.index("keyData");
payload = JSON.parse(JSON.stringify(payload));
store.put(payload);
const Query = swimlaneData.getAll(["keyData"]);
Query.onsuccess = () => {
if (__DEV__) {
console.log("Application Cache is loaded", Query.result);
}
};
transition.oncomplete = () => {
db.close();
};
};
}
如果我使用不同的版本,则此处为1-->indexedDB.open("ApplicationCache",1(我得到一个错误,好像他们的keyPath已经存在。除了版本1之外,我还遇到了这个错误。
有人能帮我哪里做错了吗
- 查看有关使用indexedDB的介绍材料
- 如果你做了一些事情,比如连接并创建一个没有架构的数据库,或者创建了一个没有显式密钥路径的对象存储,然后你存储了一些对象,然后你编辑了升级回调以指定密钥路径,然后从未触发升级回调运行,因为你继续使用当前版本号而不是更新的版本号,这将是对这个错误的一种可能的解释
- 需要升级的回调需要有逻辑来检查对象存储和索引是否已经存在,并且只有在不存在时才创建它们。如果存储不存在,请创建它及其索引。如果存储存在而索引不存在,请将索引添加到存储中。如果存储存在并且索引存在,则不执行任何操作
- 在通过连接更高版本号更改数据库架构后,您需要触发需要升级的回调来运行。如果您没有使用更高的版本号进行连接,回调将永远不会运行,因此您最终将连接到未进行架构更改的旧版本