在不进行任何其他修改的情况下升级版本时,我在使用此代码时遇到问题,我无法理解原因。
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' } );
}
}
第一次加载页面时,将创建indexedDB对象(数据库)并创建其中的表。一切正常。首先执行onupgradeneed,然后启动onsuccess。
如果我没有任何更改就重新加载页面,则一切正常,启动成功。
但是,如果更改版本号,则会出现以下错误。索引数据库API的W3C规范中简要描述了这些错误,但是到目前为止,这对我没有多大帮助。在执行onupgradeneeded之后,将执行onerror,并且出现一个AbortError,但这也不能告诉我更多信息。
Chrome 28“未捕获的错误:ConstraintError:DOM IDBDatabase异常0”
Firefox 22“由于不满足约束,事务中的变异操作失败。例如,对象存储或索引之类的对象已经存在,并且请求尝试创建一个新对象。”
据我所知,问题在于我正在尝试使用相同的键路径重新创建相同的对象,但是使脚本重新创建整个对象的新版本不是吗?
为什么我得到错误?是否应该仅按升级要求更新版本号并重写对象(数据库)?
据我所知,问题在于我正在尝试使用相同的键路径重新创建相同的对象
那是正确的。尽管键路径与它无关,但这只是对象存储库与现有对象存储库具有相同的名称。
新版本不是使脚本重新创建整个对象吗?
不能。对象存储(以及索引和数据)在整个升级过程中都是持久的,除非您在中手动将其删除onupgradeneeded
。因此,为避免发生该错误,您应event.oldVersion
在首次创建数据库时检查将其设置为0,然后将其设置为先前的版本号。然后,您可以仅在首次初始化数据库时创建对象存储,也可以在升级时重新创建对象存储之前将其删除。
更新:有关MDN IDBDatabase.createObjectStore的相关文档,该文档阐明了如何使用此调用需要唯一性。
IDBDatabase接口的createObjectStore()方法创建并返回新的对象存储或索引。
该方法采用商店的名称以及一个参数对象,该参数对象使您可以定义重要的可选属性。您可以使用该属性来唯一标识商店中的单个对象。由于属性是标识符,因此它对于每个对象都应该是唯一的,并且每个对象都应具有该属性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句