我的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"
});
};
不幸的是,这仅适用于2种情况。
[我在桌面上的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');
}
}
如果要在升级时从存储中删除所有对象,则可以添加表明表存在的逻辑,可以清除它。