如何从indexedDB获取对象存储?

5

我的应用程序在Web存储中使用了indexedDb。

我想从下面的代码中获取存储库。

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

出现了错误,我已经熟知打开indexeddb数据库和版本更改的方法。

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

我试过在断点处进行调试,那时它可以正常工作且没有出现错误。

请问我该如何获得这个存储库?请帮帮我。

提前感谢您的帮助!

3个回答

8
错误可能是因为您的db变量为null。这几乎总是因为您正在尝试将db存储在全局变量中作为回调的结果,然后在不保证只在db变量设置后执行的单独函数中访问db变量,以致浏览器发现您正在访问未初始化的变量。
解决方案很简单(但令人沮丧)。除非您想了解某个库的承诺和延迟对象的实现,否则不能以这种方式使用全局变量。相反,请查看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....
    };
}

全局变量对我来说没什么用处。我甚至都没有使用它,所以很容易删除。 - Morten
Josh,“邪恶的全局变量”是一个非常好的观点,我看到很多人在使用这种方法或IDB +1时出现错误。 - Deni Spasovski

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);
        };
};

0

欢迎提供解决方案的链接,但请确保您的回答在没有链接的情况下也有用: 添加链接周围的上下文,让其他用户了解它是什么以及为什么存在,然后引用您正在链接到的页面中最相关的部分,以防目标页面不可用。 - cursorrux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接