我有我的应用程序的网络存储IndexedDB的。
我想拿到店里形成下面的代码。
var store = myapp.indexedDB.db.transaction(['tree_nodes'],'readwrite').objectStore('tree_nodes');
它返回错误。 我是众所周知的开放IndexedDB的数据库版本变化的。
该错误是Uncaught TypeError: Cannot call method 'transaction' of null
我用的断点尝试过。 在这种情况下,它没有错误的罚款。
我怎样才能拿到店里? 请帮我。
提前致谢!
该错误可能是因为您的数据库变量为空。 这几乎总是因为你试图存储数据库中的全局变量作为回调的结果,然后在不能保证你的数据库变量后,只执行一个单独的函数访问数据库变量设置,使得浏览器找到您正在访问未初始化的变量。
解决方法很简单(但令人沮丧的)。 除非你想了解一些图书馆的实现承诺和递延对象不能以这种方式使用全局变量。 相反,看看由杰尼给出了答案。 使用回调和回调函数,而不是全局变量编写代码。 “DB”只从回调request.onsuccess函数中访问,是不是全球性的。 这就是为什么杰尼的正常工作。 他的代码将只尝试访问数据库时,它可以保证被初始化(NOT NULL)。
既然你没有张贴你周围的代码,这原来是很重要的,你需要做这样的事情:
// I am an evil global variable that will not work as expected
myapp.indexedDB.db = 'DO NOT USE ME OR YOU WILL GET AN ERROR';
// I am a good function that only accesses an initialized db variable
function doit() {
var request = window.indexedDB.open(......);
request.onsuccess = function(event) {
// Use this db variable, not your global one
var db = event.target.result;
// Note that you can also access the db variable using other means
// here like this.result or request.result, but I like to use event.target
// for clarity.
// Now work with the db variable
var store = db.transaction(['tree_nodes'],'readwrite').objectStore('tree_nodes');
// do some more stuff with store....
};
}
这里是短,你需要为了从索引资料首先,你需要以检索数据,打开数据库获取数据做什么。
var request = indexedDB.open("tree_nodes", v); // first step is opening the database
request.onsuccess = function(e) {
var db = e.target.result;
var trans = db.transaction(["tree_nodes"], 'readwrite'); //second step is opening the object store
var store = trans.objectStore("tree_nodes");
var request = store.get(id); //getting single object by id from object store
request.onsuccess = function(e) {
showDetails(e.target.result); // data retreived
db.close();
};
request.onerror = function(e) {
console.log("Error Getting: ", e);
};
};