如何从indexedDB中获取对象存储?

7uhlpewt  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(3)|浏览(260)

我已在应用程序上为数据库编制了索引,以用于Web存储。
我想得到的存储形式下面的代码。

var store = myapp.indexedDB.db.transaction(['tree_nodes'],'readwrite').objectStore('tree_nodes');

返回错误,打开indexeddb数据库和版本更改是众所周知的。
错误为Uncaught TypeError: Cannot call method 'transaction' of null
我用断点试过了。在这种情况下,它工作正常,没有错误。
我怎么才能到商店?请帮帮我。
提前感谢!

slhcrj9b

slhcrj9b1#

这个错误可能是因为您的db变量为空。这几乎总是因为您试图将db存储在一个全局变量中作为回调的结果,然后在一个单独的函数中访问db变量,该函数不保证只在设置db变量后才执行,这样浏览器就会发现您正在访问一个未初始化的变量。
解决方法很简单(但令人沮丧)。除非您想了解某个库对promise和延迟对象的实现,否则您无法以这种方式使用全局变量。相反,请查看Deni给出的答案。使用回调并在回调函数中编写代码,而不是全局变量。'db'只能从回调请求中访问。onsuccess函数,并且不是全局的。这就是为什么Deni的代码可以工作的原因。他的代码只会在数据库被保证初始化(非空)时才尝试访问数据库。
因为你没有发布你的周围代码,这是很重要的,你将需要这样做:

// 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....
    };
}
q3aa0525

q3aa05252#

下面简单介绍一下从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);
        };
};

相关问题