当我升级版本而没有任何其他修改时,我遇到了这段代码的问题,我无法理解原因.
function create_registry() {
var version = 1;
var indexeddb_db = "examples"; // database
var indexeddb_table = "examples_table"; // table
// open the database
var indexeddb_request = indexedDB.open( indexeddb_db, version ); // connect + open database
var db = false;
// if error
indexeddb_request.onerror = function ( event ) {
console.log( event.target );
console.trace();
}
// if success
indexeddb_request.onsuccess = function ( event ) {
console.log( event.target );
console.trace();
}
// if onupgradeneeded
indexeddb_request.onupgradeneeded = function( event ) {
console.log( event.target );
console.trace();
db = event.target.result;
var objectStore = db.createObjectStore( indexeddb_table, { keyPath: 'url' } );
}
}
Run Code Online (Sandbox Code Playgroud)
第一次加载页面时,将创建indexedDB对象(数据库)并创建内部表.一切正常.首先执行onupgradeneeded,然后启动onsuccess.
如果我重新加载页面没有任何更改,一切正常,onsuccess启动.
但是,如果我更改版本号,那么我会得到下面提到的错误.这些错误在索引数据库API的W3C规范中进行了简要描述,但到目前为止这对我没什么帮助.在执行onupgradeneeded之后,执行onerror并且我有一个AbortError,但这并没有告诉我更多.
Chrome 28"未捕获错误:ConstraintError:DOM IDBDatabase例外0"
Firefox 22"事务中的变异操作失败,因为不满足约束.例如,对象存储或索引等对象已经存在,并且请求尝试创建新对象."
据我所知,问题是我正在尝试使用相同的密钥路径重新创建相同的对象,但不是新版本使脚本重新创建整个对象?
为什么我收到错误?是不是onupgradeneeded只更新版本号并重写对象(数据库)?
据我所知,问题是我正在尝试使用相同的keypath重新创建相同的对象
那是正确的.尽管keypath与它无关,但它只是对象存储与现有对象存储具有相同的名称.
是不是新版本使脚本重新创建整个对象?
否.对象存储(以及索引和数据)在升级期间保持不变,除非您手动删除它们onupgradeneeded.因此,为了避免该错误,您应该event.oldVersion在第一次创建数据库时检查哪个将是0,然后将检查以前的版本号.然后,您可以仅在首次初始化数据库时创建对象存储,或者在升级时重新创建数据库之前将其删除.
更新:MDN IDBDatabase.createObjectStore上的相关文档,阐明了如何使用此调用需要唯一性.
IDBDatabase接口的createObjectStore()方法创建并返回新的对象库或索引.
该方法采用商店的名称以及允许您定义重要可选属性的参数对象.您可以使用该属性唯一标识商店中的各个对象.由于属性是标识符,因此它应该对每个对象都是唯一的,并且每个对象都应该具有该属性.
| 归档时间: |
|
| 查看次数: |
5179 次 |
| 最近记录: |