在firefox操作系统中升级索引db中的db版本时会出错。 "请求被中止,例如通过调用IDBTransaction.abort。"

时间:2014-12-22 14:40:26

标签: database firefox indexeddb firefox-os

在索引db中升级db版本时出错。 "请求被中止,例如通过调用IDBTransaction.abort。"

ConstraintError:事务中的变异操作失败,因为未满足约束。例如,对象存储或索引等对象已存在,并且正在尝试创建新对象。

任何人都可以帮助我吗?提前谢谢。

var DB_NAME = 'testdb';
var DB_VER = 2;
var db = null;

function upgradeDB(event) {
    console.log('DB upgrade needed');

    var db = event.target.result;
    var txn = event.target.transaction;
    txn.oncomplete = function(evt) {
        console.log('Upgrade complete');
    };
    txn.onerror = function(evt) {
        console.log('Upgrade failed', evt);
    };

    console.log('Creating tables');
    ..........................
    ...........................
}
var request = indexedDB.open(DB_NAME, DB_VER);
request.onsuccess = function(evt) {
    db = request.result;
    console.log('test DB opened');
    callback();
};
request.onerror = function(evt) {
    console.log('DB open failed', evt);
};
request.onupgradeneeded = upgradeDB;

1 个答案:

答案 0 :(得分:1)

如果您查看IndexedDB规范(http://www.w3.org/TR/IndexedDB/),ContraintError的原因是:

  • 使用已在该数据库中使用的名称创建对象库
  • 使用已在该对象库中使用的名称创建索引
  • 创建一个新的索引,其唯一:true约束违反了对象库中的现有数据
  • 达到密钥生成器限制
  • 执行商店中已存在密钥的add()
  • 执行add()或put(),其中索引具有唯一:true约束,生成的索引键违反

所以你要点击其中一个案例。

前两个createObjectStore / createIndex案例会同步抛出异常;一个未被捕获的异常抛出了一个"升级所需的" handler将中止事务。你可以包装你的'创建表' try / catch块中的逻辑,看看是否发生了什么。 (你不能分享代码,所以我不能指出那里的任何逻辑缺陷。)

创建一个唯一的索引:由于现有数据而失败的索引将异步失败,而不是响应任何请求,因此唯一的标志就是事务中止。

其他情况会异步发生以响应现有数据并导致特定请求失败;你可以让onerror处理程序来检测它们。