我已经谷歌搜索了一段时间,并没有找到任何可以帮助我的东西。 我只是想从IndexedDB中检索所有数据。
这是我的代码到目前为止的样子:
var request = window.indexedDB.open("List", 1);
request.onsuccess = function (event) {
db = request.result;
console.log("success: " + db);
};
request.onupgradeneeded = function (event) {
db = event.target.result;
var objectStore = db.createObjectStore("List", { keyPath: "id" });
for (var i in parsedData) {
objectStore.add(parsedData[i]);
}
console.log("RETRIEVING DATA");
var transaction = request.transaction("List");
var store = transaction.objectStore("List");
store.openCursor().onsuccess = function (e) {
var cursor = e.target.request;
if (cursor) {
console.log("List NAMES == " + cursor.value.Name);
}
}
}
现在,关于我编写的代码,需要说几件事。首先,我意识到我检索信息应该是它自己的功能(我只是这样编写它只用于打印/记录目的)。其次,由于某种原因,"检索数据"应该至少打印到日志 - 但它不会,我不知道为什么。 第三 - 最重要的是 - 我在这一行上一直收到错误:
var transaction = request.transaction("List");
错误是:JavaScript runtime error: Function expected
不确定是什么导致了我遇到的这两个问题。
答案 0 :(得分:1)
var transaction = request.transaction('List');
。请求是IDBRequest。我认为没有IDBRequest.prototype.transaction方法。您要使用的是IDBDatabase.prototype.transaction。例如,var transaction = db.transaction('List');
。var transaction = event.target.transaction;
。我不推荐这个但是有可能。cursor.continue();
以继续迭代。一个简单的示例,说明如何避免每次都必须升级数据库:
function upgradeDatabase(event) {
var db = event.target.result;
db.createObjectStore('List', { keyPath: "id" });
}
function addParsedData(parsedData, callback) {
var request = indexedDB.open('List', 1);
request.onupgradeneeded = upgradeDatabase;
request.onsuccess = function(event) {
var db = event.target.result;
var tx = db.transaction('List','readwrite');
tx.oncomplete = callback;
var list = tx.objectStore('List');
for(var i in parsedData) {
list.add(parsedData[i]);
}
};
}
function retrieve() {
var request = indexedDB.open('List', 1);
request.onupgradeneeded = upgradeDatabase;
request.onsuccess = function(event) {
var db = event.target.result;
var tx = db.transaction('List');
var list = tx.objectStore('List');
var getAll = list.openCursor();
var items = [];
tx.oncomplete = function() {
console.log('Got items %o', items);
};
getAll.onsuccess = function(event) {
var cursor = event.target.result;
if(!cursor) return;
items.push(cursor.value);
cursor.continue();
};
};
}
// This would connect, create, insert, and then select
addParsedData(parsedData, retrieve);
答案 1 :(得分:0)
我不知道为什么它没有在你的事业中显示console.log。 使用上面的代码对我不起作用,因为我没有为parsedData提供的东西,当我发表评论时,我得到了日志以及你在交易中给出的错误。
该错误是因为您不应该将其称为函数。它已经是一个开放的交易,您可以这样做:request.transaction.objectStore("<Objectstore>");
用于开设商店。
所以这可能无法解决您遇到的console.log问题,但它应该修复其他部分!