【发布时间】:2019-06-12 01:43:50
【问题描述】:
使用 IndexedDB,一旦我已经创建了读取和显示数据的事务,我似乎无法为我的对象存储创建第二个事务(只是 ToDo 的列表)。我在尝试创建第二个事务的行上没有收到错误,但没有任何反应,代码停止执行。
检索和显示我的数据的这部分运行良好:
var trans;
var ostore;
var db;
var reqdb = window.indexedDB.open("ToDoApp", 2);
reqdb.onupgradeneeded = function (event) {
console.log("running onupgradeneeded");
var myDB = event.target.result;
if (!myDB.objectStoreNames.contains("todos")) {
myDB.createObjectStore("todos", { keyPath: "ToDoTitle" });
}
};
reqdb.onsuccess = function (event) {
db = event.target.result;
trans = db.transaction(["todos"], "readonly");
ostore = trans.objectStore("todos");
var req = ostore.get("TEST IDB 2");
$("#btnSave").click(function () {
UpdateToDo();
});
req.onerror = function (event) {
alert("error");
};
req.onsuccess = function (event) {
$("#ToDoTitle").val(req.result.ToDoTitle);
};
};
这可以很好地获取和显示内容。但请注意使用 onclick 事件设置的 UpdateToDo() 函数,因此我可以实际更新我的数据。
function UpdateToDo(event) {
alert("1");
var newtransaction = db.transaction(["todos"], "readwrite");
alert("2");
var newstore = newtransaction.objectStore("todos");
newstore.openCursor().onsuccess = function (event) {
const cursor = event.target.result;
if (cursor) {
if (cursor.value.ToDoTitle == 'TEST IDB 2') {
const updateData = cursor.value;
updateData.ToDoCategory = 1; // hard coding for now
var requpdate = cursor.update(updateData);
requpdate.onsuccess = function () {
console.log('Updated');
};
requpdate.onerror = function () {
console.log('Error');
}
};
cursor.continue();
} else {
console.log('Cursor error.');
}
};
}
第一个警报会触发,但第二个不会。我假设因为返回了创建第一个事务的第一个回调,所以该事务已关闭,但它似乎仍然阻止我创建此事务。如果我完全取出第一个事务,则创建第二个事务并运行第二个警报......然后我可以从那里创建一个游标并更新数据。
我尝试将第一个事务和对象存储设为全局变量,但这也不起作用。
每页只让你执行一个事务似乎有点荒谬。我还想如何最初加载数据然后允许用户更新它?我错过了什么吗?
【问题讨论】:
-
UpdateToDo()无法获得第二个警报,因为update未定义,这就是它不会触发第二个警报的原因。 -
我在上面进行了编辑,以提供更大的代码块来查看我是如何进行更新的。我正在使用光标。但是,我不确定此时如何更新是否重要,因为我什至无法通过刚刚失败的第一条交易线。
-
再次...如果我注释掉第一个事务/存储部分,第二个事务将完全触发,所以我假设有某些原因我无法创建第二个事务。我在文档中没有看到任何可以帮助我的内容
-
我取出创建第二个事务/存储的行并将下一行从“newstore.openCursor().onsuccess”更改为使用全局存储“ostore.openCursor().onsuccess”,认为我可以重用我之前创建的对象存储。但是当我这样做时它在那里失败了。
-
我也在学习如何使用 IndexedDB。我还不够了解,但我知道您必须启动一个新实例,例如为每个请求打开一个新连接,并且您的操作(无论是创建、读取、更新或删除)都需要是对请求的回调.基本上先发出请求然后函数(事件)并处理请求返回的事件。
标签: javascript indexeddb