更新版本时,indexeddb数据库上的约束错误,没有别的

Pat*_*maS 3 indexeddb

当我升级版本而没有任何其他修改时,我遇到了这段代码的问题,我无法理解原因.

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启动.

但是,如果我更改版本号,那么我会得到下面提到的错误.这些错误在索引数据库APIW3C规范中进行了简要描述,但到目前为止这对我没什么帮助.在执行onupgradeneeded之后,执行onerror并且我有一个AbortError,但这并没有告诉我更多.

Chrome 28"未捕获错误:ConstraintError:DOM IDBDatabase例外0"

Firefox 22"事务中的变异操作失败,因为不满足约束.例如,对象存储或索引等对象已经存在,并且请求尝试创建新对象."

据我所知,问题是我正在尝试使用相同的密钥路径重新创建相同的对象,但不是新版本使脚本重新创建整个对象?

为什么我收到错误?是不是onupgradeneeded只更新版本号并重写对象(数据库)?

dum*_*ter 5

据我所知,问题是我正在尝试使用相同的keypath重新创建相同的对象

那是正确的.尽管keypath与它无关,但它只是对象存储与现有对象存储具有相同的名称.

是不是新版本使脚本重新创建整个对象?

否.对象存储(以及索引和数据)在升级期间保持不变,除非您手动删除它们onupgradeneeded.因此,为了避免该错误,您应该event.oldVersion在第一次创建数据库时检查哪个将是0,然后将检查以前的版本号.然后,您可以仅在首次初始化数据库时创建对象存储,或者在升级时重新创建数据库之前将其删除.

更新:MDN IDBDatabase.createObjectStore上的相关文档,阐明了如何使用此调用需要唯一性.

IDBDatabase接口的createObjectStore()方法创建并返回新的对象库或索引.

该方法采用商店的名称以及允许您定义重要可选属性的参数对象.您可以使用该属性唯一标识商店中的各个对象.由于属性是标识符,因此它应该对每个对象都是唯一的,并且每个对象都应该具有该属性.