如何从indexedDB获取objectstore?

kir*_*mar 1 html5 local-storage web-storage indexeddb

我在我的应用程序上有indexedDb用于网络存储.

我想通过以下代码获取商店.

var store = myapp.indexedDB.db.transaction(['tree_nodes'],'readwrite').objectStore('tree_nodes'); 
Run Code Online (Sandbox Code Playgroud)

它返回错误.我以打开indexeddb数据库和版本更改而闻名.

错误是 Uncaught TypeError: Cannot call method 'transaction' of null

我用破发点试了一下.在这种情况下,它工作正常没有错误.

我怎么去商店?请帮我.

提前致谢!

Jos*_*osh 6

该错误可能是因为您的db变量为null.这几乎总是因为您尝试将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....
  };
}
Run Code Online (Sandbox Code Playgroud)


Den*_*ski 5

这里简要介绍了从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);
        };
};
Run Code Online (Sandbox Code Playgroud)