我有一个现有的数据库。我正在尝试使用indexedDB从数据库中检索数据,但我无法从数据库中获取数据。
var data = [];
// creating or opening the database
var db;
var request = window.indexedDB.open("database");
request.onerror = function(event) {
console.log("error: ");
};
request.onsuccess = function(event) {
db = request.result;
console.log("success: "+ db);
};
request.onupgradeneeded = function(event) {
var db = event.target.result;
var objectStore = db.createObjectStore("Subject", {keyPath: "id"});
for (var i in data) {
objectStore.add(data[i]);
}
}
function readAll() {
var objectStore = db.transaction("Subject").objectStore("Subject");
console.log(objectStore);
objectStore.openCursor().onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
alert("Name for id " + cursor.key + " is " + cursor.value.Subject);
cursor.continue();
}
else {
alert("No more entries!");
}
};
}
先谢谢。
答案 0 :(得分:1)
你非常接近。
var data = [];
我会假设你确实在某个地方有一些数据,而且它确实有一个id属性,因为你将它指定为索引键,例如。
var data = [{id: 'foo' }, { id: 'bar' } ];
现在这里:
var objectStore = db.createObjectStore("Subject", {keyPath: "id"});
for (var i in data) {
objectStore.add(data[i]);
}
(Careful与for..in
和数组)
我认为你实际上并没有在这里添加任何数据,这是你无法阅读的原因之一。要将数据添加到对象库,请先尝试创建一个读/写事务,然后获取对象库的引用并添加对象。
var trans = db.transaction(["Subject"], "readwrite").objectStore("Subject");
注意使用数组作为transaction()
的第一个参数,将“readwrite”作为第二个参数。 (某些示例使用IDBTransaction.READ_WRITE
常量,但这似乎不适用于最新版本的Webkit。)
var objectStore = db.transaction("Subject").objectStore("Subject");
请改为尝试:
var trans = db.transaction( [ "Subject" ] );
, objectStore = trans.objectStore( "Subject" );
objectStore.openCursor( IDBKeyRange.lowerBound(0) ).onsuccess = function(event) {..}
答案 1 :(得分:0)
我确实遇到过同样的错误一次。这是因为有时甚至在返回结果数据之前执行onSuccess。所以你应该检查结果数据是否为空。
要解决此问题,请尝试使用oncomplete而不是onSuccess,并使用Jquery indexedDB插件。该插件需要certin代码更改,但indexedDB的实现更加一致。 见http://nparashuram.com/jquery-indexeddb/