我正在尝试使用IndexedDB创建两个对象存储并在其中存储数据。第一个对象存储是使用数据创建的,但是在创建第二个对象存储并存储数据之后,处理程序会出错并检查evt.srcElement - > IDBOpenDBRequest-->错误:DOM错误,消息:“版本更改事务在upgradeneeded事件处理程序中被中止”并且名称:“ABortError”
var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;
var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;
var db;
var request = indexedDB.open("xxMobileDB", 1);
request.onsuccess = function (evt) {
db = request.result;
var version = parseInt(db.version);
db.close();
var request1 = indexedDB.open("xxMobileDB", version + 1);
request1.onupgradeneeded = function (evt)
{
var objectBOMStore = evt.currentTarget.result.createObjectStore(
"BOM", { keyPath: "PackNumber", autoIncrement: true });
objectBOMStore.createIndex("PackNumber", "PackNumber", { unique: false });
for (var i = 0; i < BOMData.length; i++)
{
var obj = BOMData[i];
objectBOMStore.add(obj);
}
};
request1.onsuccess = function (evt)
{
evt.target.result.close();
};
request1.onerror = function (evt) {
console.log("IndexedDB error: " + evt.target.errorCode);
};
};
request.onerror = function (evt) {
console.log("IndexedDB error: " + evt.target.errorCode);
};
request.onupgradeneeded = function (evt)
{
var objectStore = evt.currentTarget.result.createObjectStore(
"Pack", { keyPath: "PackId", autoIncrement: true });
objectStore.createIndex("PackId", "PackId", { unique: true });
for (var i = 0; i < packData.length; i++)
{
var obj = packData[i];
objectStore.add(obj);
}
};
填充objectBOMStore后,代码进入request1.error。创建对象存储包时没有任何错误,我可以在Chrome中看到它们 - &gt;资源 - &gt;索引资料
答案 0 :(得分:3)
我认为包号不是唯一的。由于我将KeyPath设为PackNumber,因此PackNumber值必须是唯一的。我使用了另一个独特的专栏并解决了这个问题。
var objectBOMStore = evt.currentTarget.result.createObjectStore(
"BOM", { keyPath: "PackNumber", autoIncrement: true });
我使用的是一个唯一编号的BOMID。
var objectBOMStore = evt.currentTarget.result.createObjectStore(
"BOM", { keyPath: "BOMID", autoIncrement: true });