我的应用程序上有用于web存储的indexedDb。
我想从下面的代码中获得商店。
var store = myapp.indexedDB.db.transaction(['tree_nodes'],'readwrite').objectStore('tree_nodes');
它返回错误。我以打开indexeddb数据库和版本更改而闻名。
错误是
Uncaught TypeError: Cannot call method 'transaction' of null
我用断点试过了。在这种情况下,它工作得很好,没有错误。
我怎样才能找到那家商店?请帮帮我。
提前感谢!
发布于 2013-05-05 05:31:40
错误可能是因为您的db变量为空。这几乎总是因为您试图将db存储在一个全局变量中作为回调的结果,然后在一个单独的函数中访问db变量,该函数不能保证只在设置了db变量之后才执行,这样浏览器就会发现您正在访问一个未初始化的变量。
解决方案很简单(但令人沮丧)。您不能以这种方式使用全局变量,除非您想了解某些库对promises和延迟对象的实现。相反,看看Deni给出的答案。使用回调并在回调函数中编写代码,而不是全局变量。“‘db”只能从回调request.onsuccess函数中访问,并且不是全局的。这就是为什么Deni的能行得通。他的代码将仅在保证被初始化(非空)时才尝试访问db。
因为你没有发布你周围的代码,这是很重要的,你需要这样做:
// 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....
};
}
发布于 2012-08-10 22:59:29
简而言之,为了从indexeddb获取数据,您首先需要打开数据库以检索数据。
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);
};
};
https://stackoverflow.com/questions/11898375
复制相似问题