我的代码如下(通常命名约定为众所周知的对象):
var DBOpenRequest = window.indexedDB.open("messages", 6);
//...
DBOpenRequest.onupgradeneeded = function(event) {
console.log("Need to upgrade.");
var db = event.target.result;
console.log(db);
db.onerror = function(event) {
console.log("Error upgrading.");
};
// Create an objectStore for this database
var objectStore = db.createObjectStore("messages", { keyPath: "id", autoIncrement: true });
};
这在版本3和4中运行得很好。当运行到版本5时,我得到了错误:
无法在“IDBDatabase”上执行“createObjectStore”:具有指定名称的对象存储已存在。在IDBOpenDBRequest.DBOpenRequest. onupgradenededcreateObjectStore
不是在一个新版本的空数据库上运行吗?如何修复此错误?
我碰巧记录了db
对象,详细信息如下:
我很好奇为什么版本号在摘要行和展开时不一样。
2条答案
按热度按时间suzh9iv81#
createObjectStore不是在新版本的空数据库上运行吗?
当你得到
upgradeneeded
时,数据库处于你之前离开它时的状态。因为你不知道用户会访问你的代码的什么版本,你需要查看事件的oldVersion
来找出它是什么。典型的模式如下:我很好奇为什么版本号在摘要行和展开时不一样。
这一点很微妙...我相信在记录
5
时,数据库已经开始升级。但由于在upgradeneeded
处理程序中抛出了异常,升级被中止,并且在记录详细信息之前,版本号回滚到4
。g52tjvyc2#
升级DB的最佳方法是检查存储名称是否已经存在。
如果需要检查indexName是否已经存在,可以获取objectStore并检查indexNames属性是否包含所需的indexName。
使用indexDB API与indexNames和objectStoreNames来检查是否存在某些内容,这使我的代码更加可靠和易于维护,在使用数据库版本控制使用IndexDB中也简要提到了这一点