Добавить индекс в предварительно существующий объект-хранилище в IndexedDB с помощью Javascript

Я видел несколько примеров использования 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 });

Ответ 1

Вы делаете это во время onupgradeneeded, который должен быть тем же самым местом, где вы делаете хранилище объектов в первую очередь. Там вы можете сделать все необходимое для его обновления, например, создать новый индекс. Вот пример.

Ответ 2

В настоящее время 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");
}