我刚刚学习了indexedDB,这是我对建立数据库的理解.您调用.open(dbName)
以获取数据库实例.如果用户的计算机上不存在此名称的数据库(例如,如果这是他们第一次访问该站点),则会触发onUpdateNeeded事件,因此您应该在其中执行初始化操作,例如创建ObjectStores.
现在,您还可以传入一个版本 - .open(dbName, version)
- 如果数据库存在但使用较低版本,则会强制执行onUpdateNeeded事件.现在,我可以看到这个的效用......但为什么有一个整数参数?如果"版本"参数的要点是强制更新,为什么不只是有一个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; // ... };
这是一种非常常见的模式.显然,可以想象这是手动完成的 - 开发人员可以在特殊的元数据表中跟踪版本 - 而不是将其载入标准.但它很常见,它是内置的,类似于索引和密钥生成器.
有一个有效的论点,这使得API对于初学者来说太复杂了,但没有时间机器,它有点没有实际意义.
...
如果您在本地进行调试并且更改受限于您的计算机,则删除/重新创建数据库可能比为每个次要更改编写架构升级逻辑更容易.