【问题标题】:Adding an index to an existing object store in IndexedDB向 IndexedDB 中的现有对象存储添加索引
【发布时间】:2016-09-07 21:30:04
【问题描述】:

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

在新的对象存储上执行此操作有据可查:

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 });
  }
};

【问题讨论】:

    标签: javascript indexeddb


    【解决方案1】:

    您希望从 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中查找索引名称。

    【讨论】:

    猜你喜欢
    • 2012-11-09
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多