обновить существующий ключевой путь индекса хранилища объектов при обновлении индексированной БД
Я использую индексированную БД для автономного хранения. БД имеет много хранилищ объектов, и каждое хранилище объектов имеет индексы. Индекс IDB состоит из имени и ключевого ключа(col, к которому мы применяем индексацию) свойства. Обычно мы сохраняем оба значения свойств одинаковыми (чтобы легко идентифицировать индекс по имени col). Теперь мое требование - для индекса только изменить ключевой путь (имя индекса остается тем же) .
В upgradeneeded callback (DBOpenRequest.onupgradeneeded) я могу получить объект store от сделки.
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" . Итак, как я могу получить существующий ключевой путь индекса для сравнения с новым ключевым путем.
1 ответ:
Попробуйте что-нибудь вроде следующего:
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.