首页 > 解决方案 > 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"
    });
};

不幸的是,这只适用于两种情况。

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

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

问题是,我已经有现有用户,他们没有选择删除智能手机上的 IndexedDB,除了在用户体验方面不是一个选项。

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

提前致谢。

标签: javascriptgoogle-chromemobileprogressive-web-appsindexeddb

解决方案


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

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

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


推荐阅读