обновить существующий ключевой путь индекса хранилища объектов при обновлении индексированной БД


Я использую индексированную БД для автономного хранения. БД имеет много хранилищ объектов, и каждое хранилище объектов имеет индексы. Индекс 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 3

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.