为什么indexedDB使用“版本”?

h4cxqtbf  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(2)|浏览(377)

我刚刚学习了indexedDB,这是我对建立数据库的理解。调用.open(dbName)来获取一个DB示例。如果用户的计算机上不存在同名的数据库(例如,如果这是用户第一次访问该站点),那么这将触发onUpdateNeeded事件,因此您应该在该事件中执行初始化操作,如创建ObjectStore。
现在,您还可以传入一个版本-.open(dbName, version)-如果数据库存在但使用的是较低的版本,则无论如何都会强制一个onUpdateNeeded事件。现在,我可以看到它的实用性...但为什么要使用整数参数呢?如果“version”参数的目的是强制更新,为什么不使用一个forceUpdate标志呢?为什么要使用一个整数版本参数,在调试代码时需要将其递增,在经过许多天的调试后,可能会达到版本156。
除了强制更新之外,这个版本是否还用于其他我不知道的功能?如果不是,其背后的原理是什么?此外,您是否打算在开发期间不断更改版本,但在应用发布后保持不变,还是应该在应用的整个生命周期内不断更改版本?

cuxqih21

cuxqih211#

单调递增的整数允许此模式:

var open = indexedDB.open('db', 3);
open.onupgradeneeded = function(e) {
  var db = open.result;
  if (e.oldVersion < 1) {
    // create v1 schema
  }
  if (e.oldVersion < 2) {
    // upgrade v1 to v2 schema
  }
  if (e.oldVersion < 3) {
    // upgrade v2 to v3 schema
  }
  // ...
};
open.onsuccess = function() {
  var db = open.result;
  // ...
};

这是一种非常常见的模式。显然,人们可以想象这是手动完成的--开发人员可以在一个特殊的元数据表中跟踪一个版本--而不是将其纳入标准。但它是内置的,类似于索引和密钥生成器,这已经足够常见了。
有一个有效的论点是,这使得API对于初学者来说太复杂了,但是如果没有时间机器,这就有点没有意义了。
...
如果您在本地调试,并且更改仅限于您的计算机,那么删除/重新创建数据库可能比为每个小更改编写模式升级逻辑更容易。

kd3sttzy

kd3sttzy2#

我为商业企业开发商业应用程序,当我遇到你的问题时,我笑了。有趣的是,这个问题是6年前问的。
我遇到过一个客户端需要在服务器数据库中添加新特性的情况,这就导致我们也要在客户端的数据库中添加新特性,这意味着我们不能没有这个版本号。我们必须为新的应用程序版本指定一个更高的数据库版本号,以便让浏览器知道只需将数据库迁移到新版本,此时仍保留旧的用户数据而不是删除和重新初始化一个全新的数据库。

相关问题