我正在使用Indexed DB进行离线存储。 DB有许多Object Store,每个Object Store都有索引。 IDB索引包括name和keyPath(我们应用索引的col)属性。通常我们将两个属性值保持一致(通过col名称轻松识别索引)。现在我的要求是索引只更改KeyPath(索引的名称保持不变)。
在upgradeneeded回调(DBOpenRequest.onupgradeneeded)中,我能够从事务中获取对象存储。
DBOpenRequest.onupgradeneeded = function(event) {
var transaction = event.target.transaction;
var objectStore = transaction.objectStore("objectStore Name");
var IDBIndexObj = objectStore.index("indexName");//exception
if(IDBIndexObj.keyPath !== "newKeyPath"){
//delete index and create new index with the new keypath
}
};
但是对象存储只有索引的名称。当我尝试创建IDBIndex对象时,抛出异常,因为事务是“versionchange”类型。 那么,如何让现有的索引键路径与新的键路径进行比较。
答案 0 :(得分:3)
尝试以下内容:
function onUpgradeNeeded(event) {
var db = event.target.result;
var storeNames = db.objectStoreNames;
var myStore = null;
if(storeNames.contains('myStoreName')) {
myStore = event.target.transaction.objectStore('myStoreName');
} else {
myStore = db.createObjectStore('myStoreName', ...);
}
var indexNames = myStore.indexNames;
var desiredKeyPathForMyIndex = ...;
if(indexNames.contains('myIndexName')) {
var myIndex = myStore.index('myIndexName');
var currentKeyPath = myIndex.keyPath;
if(currentKeyPath != desiredKeyPathForMyIndex) {
myStore.deleteIndex('myIndexName');
myStore.createIndex('myIndexName', desiredKeyPathForMyIndex);
}
} else {
myStore.createIndex('myIndexName', desiredKeyPathForMyIndex);
}
}
查看https://developer.mozilla.org/en-US/docs/Web/API/IDBIndex以了解有关访问IDBIndex的其他属性的更多信息。