javascript - IndexedDB - 新版本的数据库
问题描述
我的 PWA 使用 IndexedDB 来存储数据。
现在我为其发布了 2.0 版,这需要将数据存储在第三个 ObjectStore 中。
首次发布 PWA 时,创建的 IndexedDB 的版本为“1”,如下所示。
var db;
var request = window.indexedDB.open("database-db", 1);
// Creating ObjectStores
request.onupgradeneeded = function(event) {
var db = event.target.result;
var driverTable = db.createObjectStore("driver");
var claimTable = db.createObjectStore("claim", {
autoIncrement: "true"
});
};
对于 2.0 版,我现在继续在我的“onupgradeneeded”处理程序中创建了另一个 ObjectStore(语言),并像这样更改了版本,希望 IndexedDB 会在后台自动重新加载新版本。
var db;
var request = window.indexedDB.open("database-db", 2);
// Creating ObjectStores
request.onupgradeneeded = function(event) {
var db = event.target.result;
var languageTable = db.createObjectStore("language");
var driverTable = db.createObjectStore("driver");
var claimTable = db.createObjectStore("claim", {
autoIncrement: "true"
});
};
不幸的是,这只适用于两种情况。
我在桌面上的 Chrome 中打开 PWA,并在 DevTools 的 Application-Tab 中删除 IndexedDB,然后重新加载页面。
我以前从未打开过该网站,因此我的浏览器中没有安装 IndexedDB。
问题是,我已经有现有用户,他们没有选择删除智能手机上的 IndexedDB,除了在用户体验方面不是一个选项。
有没有更好的方法来解决这个问题?
提前致谢。
解决方案
是的,有更好的方法来解决这个问题。您可以进行基于版本号的检查,或者只检查事物是否存在。这是一些简单的示例代码,用于检查商店是否存在,如果商店不存在则仅创建商店。
function myOnUpgradeNeeded(event) {
const db = event.target.result;
if (db.objectStoreNames.contains('mystorename') {
console.log('mystorename already exists, not recreating');
} else {
console.log('mystorename does not exist, creating');
db.createObjectStore('mystorename');
}
}
如果要在升级时从存储中删除所有对象,则可以添加逻辑,说明如果表存在,则可以清除它。
推荐阅读
- java - 自定义 JFrame 类不出现
- kubernetes - 以后的入口子路径可以覆盖早期的入口父路径吗?
- javascript - 速记承诺链
- r - 在 r 中解析和粘贴变量
- python - 在 Python 字典中查找最接近的值并返回其键
- jquery - 发送请求后触发 jQuery ajaxPrefilter
- hadoop - Hive Beeline 输出 ^M 和空字符
- typescript - 如何在 TypeScript 中为特定类型的泛型类型创建扩展方法
- python - 如何删除除 1 个特定小部件以外的所有子项?
- java - Javassist ; 引起:编译错误:没有这样的类:记录器