在我的项目中,我通过包装器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总是有一个元素。
我该如何解决这个问题?
答案 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())