更新版本时,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' } );
    }

}

第一次加载页面时,将创建indexedDB对象(数据库)并创建其中的表。一切正常。首先执行onupgradeneed,然后启动onsuccess。

如果我没有任何更改就重新加载页面,则一切正常,启动成功。

但是,如果更改版本号,则会出现以下错误。索引数据库APIW3C规范中简要描述了这些错误,但是到目前为止,这对我没有多大帮助。在执行onupgradeneeded之后,将执行onerror,并且出现一个AbortError,但这也不能告诉我更多信息。

Chrome 28“未捕获的错误:ConstraintError:DOM IDBDatabase异常0”

Firefox 22“由于不满足约束,事务中的变异操作失败。例如,对象存储或索引之类的对象已经存在,并且请求尝试创建一个新对象。”

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

为什么我得到错误?是否应该仅按升级要求更新版本号并重写对象(数据库)?

愚蠢的事情

据我所知,问题在于我正在尝试使用相同的键路径重新创建相同的对象

那是正确的。尽管键路径与它无关,但这只是对象存储库与现有对象存储库具有相同的名称。

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

不能。对象存储(以及索引和数据)在整个升级过程中都是持久的,除非您在中手动将其删除onupgradeneeded因此,为避免发生该错误,您应event.oldVersion在首次创建数据库时检查将其设置为0,然后将其设置为先前的版本号。然后,您可以仅在首次初始化数据库时创建对象存储,也可以在升级时重新创建对象存储之前将其删除。

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何找到Java更新版本?

反应路由器-更新版本后withRouter上的打字稿错误

是否有Java代码约定的更新版本

更新版本时如何更改iTunes Connect中的iOS应用程序图标?

Maven更新版本的特定依赖项

如何在更新版本的Yocto上使用“ HelloWorld-BitBake Style”?

存储与用户相关的数据,仅此而已

使用更新版本的Glide Library(4.7.1)会导致绑定错误问题

GitVersion和bower.json更新版本

用osascript打开bash的更新版本

如何将熊猫数据框与其更新版本进行比较?

如何在Ubuntu上安装PEAR / PHPUnit的更新版本?

每次更新版本时,VLC的“构建字体缓存”是做什么的?

如何安装HTML整洁的更新版本

使用firefox的更新版本

如何在Linux Mint上使用更新版本的GTK +运行Eclipse Mars

如何最好地重新测试更新版本或开发版本中的错误?

Android SQLite。在更新版本时添加列

将加密(从PyCrypto)安装到更新版本时出现问题

AppArmor 错误:在更新版本的 libvirt (1.2.12) 上启动 lxc 后出现“无效的 VM 定义”

如何在 Ubuntu 16.04 LTS 及更新版本上正确安装 MATE 桌面环境?

获取更新版本的 QGIS

每次提交时更新版本号

更新 Maven 继承的属性时更新版本

文件已被更新版本的 Java 运行时错误 SceneBuilder 编译

在 AWS Lambda 上安装更新版本的 sqlite3

如何在使用新版本打开时替换前端数据库

`@types/node` 的最新更新版本产生了错误。以前的版本运行良好

如何在使用新版本打开时替换前端数据库