将索引添加到IndexedDB中的现有对象库

Tal*_*ter 2 javascript indexeddb

如何在升级所需事件中向先前创建的对象库添加索引?

在新的对象存储上执行此操作已有详细记录:

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 });
};
Run Code Online (Sandbox Code Playgroud)

但是,如何将索引添加到我之前创建的对象库中?

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 });
  }
};
Run Code Online (Sandbox Code Playgroud)

Jos*_*osh 5

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

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

请记住,您必须重写onupgradeneeded函数,以便只有在创建商店时才尝试获取商店,并且只创建尚未创建的索引.有几种方法可以做到这一点.一种是使用版本号.您可以针对升级之前存在的旧版本或新/当前版本进行测试.例如,event.oldVersion如果你想使用.或者,您可以测试商店是否存在,并通过查找商店名称db.objectStoreNames.contains并在其中查找索引名称来单独测试索引是否存在store.indexNames.contains.