在indexedDb中指定具有多个表的keyPath

时间:2017-11-13 11:08:44

标签: indexeddb dexie

在我的项目中,我通过包装器Dexie.js使用indexedDb。目标是直接从indexedDb获取数据,而不是一直调用api。

由于我可能会不时更改/删除某些数据,因此我会使用版本号来跟踪用户缓存中的内容。因此,当应用程序启动时,我会收到db的版本,如果它与缓存中的版本匹配,我将获取indexedDb,否则我将删除indexedDb并从服务器获取新数据。

问题是我无法在不添加其他条目的情况下找到更新版本值的方法。现在这就是我正在做的事情:

       db.version(1).stores({
              buildings: "id, name, address, lat, long, purchased, [lat+long]",
              versions: "id, version",
          });

          db.open().then((el) => {
              console.log(el);
              this.eventBus.$on("refresh-map", () => {
                  this.fetchHexagons();
              });
          }).catch(Dexie.MissingAPIError, (e) => {
              console.log("Couldn't find indexedDB API");
              console.log(e);
              rollback = true;
          }).catch((error) => {
              console.log(`error: ${error}`);
          });

          db.versions.toArray((res) => {
              if (res.length > 0 && res[0].version != version.body.model_version) {
                  db.buildings.clear().then(() => {
                      console.log("clearing buildings");
                  });
              }

              db.versions.update(1, { version: "2"}).then((update) => {
                  if (!update) {
                      db.versions.put({ version: version.body.model_version });
                  }
              });

问题是我收到以下错误:

dexie.es.js?f8d5:1384 Unhandled rejection: Error: Failed to execute 'put' on 'IDBObjectStore': Evaluating the object store's key path did not yield a value.

我只是想确保每当我添加/放置版本字段时,我只替换该值而不添加任何其他内容:这就是"版本中的数据库" table总是有一个元素。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

这一行:

db.versions.put({ version: version.body.model_version });

...需要提供一个id:

db.versions.put({ id: someUniqueId, version: version.body.model_version });

另一种选择是使用自动递增的主键。如果是这样,您将需要重新创建数据库(主键可能不会在现有数据库上更改):

db.version(1).stores({
    buildings: "id, name, address, lat, long, purchased, [lat+long]",
    versions: "++id, version",
});

重新创建db:

db.delete().then(()=>db.open())