在索引数据库升级时更新对象存储的现有索引键路径

update existing index keypath of an object store on indexed db upgrade

我正在使用索引数据库进行离线存储。 DB有很多Object Store,每个Object Store都有索引。 IDB 索引包含名称和 keyPath(我们应用索引的列)属性。通常我们保持两个属性值相同(以便通过 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" 类型 ,因此抛出异常。 那么,如何获取现有索引键路径以与新键路径进行比较。

尝试如下操作:

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 的其他属性的更多信息。