IndexedDB-数据库的新版本

问题描述 投票:0回答:1

我的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种情况。

  1. [我在桌面上的Chrome中打开PWA,然后在DevTools的Application-Tab中删除IndexedDB,然后重新加载页面。

  2. 我以前从未打开过该站点,因此没有在我的浏览器中安装IndexedDB。

问题是,我已经有现有用户,他们没有选择删除其智能手机上的IndexedDB的权限,除了不能从用户体验的角度考虑。

是否有更好的方法来解决这个问题?

提前感谢。

javascript google-chrome mobile progressive-web-apps indexeddb
1个回答
0
投票

是的,有更好的方法来解决此问题。您可以进行基于版本号的检查,或者只是检查是否存在。这是一些简单的示例代码,用于检查商店是否存在,并仅在不存在的情况下创建商店。

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

如果要在升级时从存储中删除所有对象,则可以添加表明表存在的逻辑,可以清除它。

© www.soinside.com 2019 - 2024. All rights reserved.