Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript indexedDB为什么使用“a”;版本;?_Javascript_Indexeddb - Fatal编程技术网

Javascript indexedDB为什么使用“a”;版本;?

Javascript indexedDB为什么使用“a”;版本;?,javascript,indexeddb,Javascript,Indexeddb,我正在学习indexedDB,这是我对建立数据库的理解。您可以调用.open(dbName)来获取一个DB实例。如果用户的计算机上不存在此名称的数据库(例如,如果这是他们第一次访问站点),则会触发OnUpdate Required事件,因此您应该在该事件中执行初始化操作,如创建ObjectStores 现在,您还可以传入一个版本-.open(dbName,version)——如果数据库存在,但使用较低版本,则不管如何,这都会强制执行一个onUpdateNeeded事件。现在,我可以看到这个的效用

我正在学习indexedDB,这是我对建立数据库的理解。您可以调用
.open(dbName)
来获取一个DB实例。如果用户的计算机上不存在此名称的数据库(例如,如果这是他们第一次访问站点),则会触发OnUpdate Required事件,因此您应该在该事件中执行初始化操作,如创建ObjectStores

现在,您还可以传入一个版本-
.open(dbName,version)
——如果数据库存在,但使用较低版本,则不管如何,这都会强制执行一个onUpdateNeeded事件。现在,我可以看到这个的效用。。。但是为什么有一个整数参数呢?如果“version”参数的目的是强制更新,为什么不使用
forceUpdate
标志呢?为什么会有一个整数版本的参数,所以在调试代码时需要增加更高的值,可能在调试了很多天后达到版本156


除了强制更新之外,我还不知道该版本是否用于某些功能,如果不是,其背后的原理是什么?此外,您是打算在开发过程中不断更改版本,但在应用发布后将其固定,还是希望在应用的整个生命周期中不断更改版本?

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

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;
  // ...
};
var open=indexedDB.open('db',3);
open.onupgradeneeded=函数(e){
var db=打开的结果;
如果(如旧版本<1){
//创建v1模式
}
如果(如旧版本<2){
//将v1升级到v2架构
}
如果(如旧版本<3){
//将v2升级到v3架构
}
// ...
};
open.onsuccess=函数(){
var db=打开的结果;
// ...
};
这是一种非常常见的模式。显然,可以想象这是手动完成的——开发人员可以在一个特殊的元数据表中跟踪一个版本,而不是将其包含在标准中。但它是内置的,与索引和键生成器类似,这已经足够普遍了

有一种有效的观点认为,这使得API对于初学者来说过于复杂,但如果没有时间机器,这就有点没有意义了


如果您在本地调试,并且更改被限制在您的计算机上,那么删除/重新创建数据库可能比为每个小更改编写架构升级逻辑更容易。

我有一个个人的后续问题:新版本的每个条件块是否真的需要从所有可能的先前架构状态迁移?当你将评论升级为V2到V3时,你不必总是考虑在同一块内从V1升级到V3吗?例如,一个chrome扩展升级包含一个db模式,在更新之间经过了几次本地修订?oops,我在我的示例中犯了一个错误。它应该检查事件的旧版本,而不是数据库的版本。Fix来了…好吧,Fix做了-很抱歉。由于if语句没有ELSE,如果需要,将运行多个块。特别是。。。如前所述,从v1到v3的升级将通过将v1升级到v2,然后再将v2升级到v3来处理。@JoshuaBell每个表单加载都可以使用自己版本的IndexedDb吗?例如,ID1-使用数据库的ver1,ID2-使用数据库的VER2。我们有一个场景,其中每个表单都可以使用不同版本的查找表。数据需要进行版本控制,每个表单ID都需要以某种方式取回它所使用的特定版本的数据。在您发布程序、有人使用它、保存了一些数据,以及您进行了不兼容地存储数据的更新之后,此功能非常有用。当然,对于本地测试,您只需要每次都清除它。