为什么indexedDB使用"版本"?

时间:2015-12-15 21:56:47

标签: javascript indexeddb

我刚刚学习了indexedDB,这是我对设置数据库的理解。您调用.open(dbName)来获取数据库实例。如果用户的计算机上不存在此名称的数据库(例如,如果这是他们第一次访问该站点),则会触发onUpdateNeeded事件,因此您应该在此处执行初始化操作,例如创建ObjectStores。 / p>

现在,您还可以传入一个版本 - .open(dbName, version) - 如果数据库存在但使用较低版本,则会强制执行onUpdateNeeded事件。现在,我可以看到这个的效用......但为什么有一个整数参数?如果"版本"的要点参数是强制更新,为什么不只是有一个forceUpdate标志?为什么有一个整数版本参数,因此在调试代码时需要增加更多,可能在经过多天的调试后达到版本156?

除了强制更新之外,某些功能中使用的版本是否是我不知道的,如果没有,那么它背后的基本原理是什么?另外,您是打算在开发期间不断更改版本,但是一旦应用程序发布就保持修复,或者您是否应该在应用程序的整个生命周期中不断更改它?

1 个答案:

答案 0 :(得分:8)

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

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对于初学者来说太复杂了,但是如果没有时间机器,那就有点不明智了。

...

如果您在本地进行调试并且更改受限于您的计算机,则删除/重新创建数据库可能比为每次次要更改编写架构升级逻辑更容易。

相关问题