Javascript 向IndexedDB中的现有对象存储添加索引

Javascript 向IndexedDB中的现有对象存储添加索引,javascript,indexeddb,Javascript,Indexeddb,如何在“需要升级”事件中向先前创建的对象存储添加索引 在新对象存储上执行此操作有很好的文档记录: request.onupgradeneeded = function(event) { var db = event.target.result; var objectStore = db.createObjectStore("my-store", { keyPath: "id" } ); objectStore.createIndex("idx_name", "index_

如何在“需要升级”事件中向先前创建的对象存储添加索引

在新对象存储上执行此操作有很好的文档记录:

request.onupgradeneeded = function(event) {
  var db = event.target.result;
  var objectStore = db.createObjectStore("my-store",
    { keyPath: "id" }
  );
  objectStore.createIndex("idx_name", "index_this", { unique: false });
};
但是,如何将索引添加到以前创建的对象存储中

request.onupgradeneeded = function(event) {
  var db = event.target.result;
  if (!db.objectStoreNames.contains("my-store")) {
    var objectStore = db.createObjectStore("my-store",
      { keyPath: "id" }
    );
  }
  var myStore = ?????????????;
  if (!myStore.indexNames.contains("idx_name")) {
    myStore.createIndex("idx_name", "index_this", { unique: false });
  }
};

您希望从onupgradeneeded函数范围内隐式提供给您的事务中检索对对象存储的引用

function onupgradeneeded(event) {
  var request = event.target;
  var tx = request.transaction;
  var store = tx.objectStore('store-name');
  store.createIndex(...);
}

请记住,您必须重写onupgradeneeded函数,以便仅在已创建存储时尝试获取该存储,并且仅在尚未创建索引时尝试创建该索引。有几种方法可以做到这一点。一种是使用版本号。您可以针对升级之前存在的旧版本或新/当前版本进行测试。例如,如果需要,请使用
event.oldVersion
。或者,您可以通过使用
db.objectStoreNames.contains
查找存储名,并在
store.indexNames.contains
中查找索引名,来测试存储是否存在,并单独测试索引是否存在,谢谢!以下是我最后得到的代码: