Ответ 1
Вы делаете это во время onupgradeneeded
, который должен быть тем же самым местом, где вы делаете хранилище объектов в первую очередь. Там вы можете сделать все необходимое для его обновления, например, создать новый индекс. Вот пример.
Я видел несколько примеров использования JavaScript createIndex
для определения индекса ObjectStore непосредственно после создания ObjectStore следующим образом:
var objectStore = ixDb.createObjectStore(osName, { keyPath: pkName, autoIncrement: autoIncrement });
objectStore.createIndex("name", "name", { unique: false });
Может ли кто-нибудь показать мне, как использовать createIndex
в ранее существовавшей таблице без вызова createObjectStore
? Я предполагаю, что реальный вопрос заключается в том, как получить ссылку на объектStore без использования createObjectStore
?
Я попробовал несколько вариантов следующих действий:
var objectStore = window.IDBTransaction.objectStore(ObjectStoreName);
var index = objectStore.createIndex(ixName, fieldName, { unique: unique, multiEntry: multiEntry });
Вы делаете это во время onupgradeneeded
, который должен быть тем же самым местом, где вы делаете хранилище объектов в первую очередь. Там вы можете сделать все необходимое для его обновления, например, создать новый индекс. Вот пример.
В настоящее время Chrome не поддерживает событие onupgradededededed. Если вы хотите получить ссылку на ObjectStore с использованием старых или новых спецификаций W3, это одно из возможных способов обхода путем события onsuccess, используя либо старую команду setVersion, либо новое событие onupgradedededed:
var ixDb;
var ixDbRequest;
var ixDbVersionTansaction;
//Check to see if we have a browser that supports IndexedDB
if (window.indexedDB) {
ixDbRequest = window.indexedDB.open(dbName, dbVersion);
//For browsers like chrome that support the old set version method
ixDbRequest.onsuccess = function (e) {
ixDb = ixDbRequest.result || e.result;
if (typeof ixDb.setVersion === "function") {
//Put your version checking logic here
if (oldVersion < newVersion) {
var verRequest = ixDb.setVersion(newVersion);
verRequest.onerror = function (e) {
//handling error logic here
}
verRequest.onsuccess = function (e) {
//Get a reference to the version transaction
//from the old setVersion method.
ixDbVersionTansaction = verRequest.result;
//Create database using function provided by the user.
UserFunction();
}
}
}
};
ixDbRequest.onupgradeneeded = function (e) {
//FF uses this event to fire the transaction for upgrades.
//All browsers will eventually use this method. Per - W3C Working Draft 24 May 2012
ixDb = ixDbRequest.result || e.currentTarget.result;
//Get a reference to the version transaction via the onupgradeneeded event (e)
ixDbVersionTansaction = e.currentTarget.transaction;
//Create database using function provided by the user.
UserFunction();
};
UserFunction(){
//ObjectStore is accessed via ixDbVersionTansaction variable
// in either instance (transaction..objectStore("ObjectStoreName"))
var ObjectStore = ixDbVersionTansaction.objectStore("ObjectStoreName");
var index = ObjectStore.createIndex("ixName", "fieldName");
}