如何从indexedDB获取对象存储?

2023-12-05

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

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

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

它返回错误。我对打开indexeddb数据库和版本更改很熟悉。

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

我用断点尝试过。在这种情况下,它可以正常工作,不会出现错误。

我怎样才能到达商店?请帮我。

提前致谢!


该错误可能是因为您的 db 变量为空。这几乎总是因为您尝试将 db 作为回调的结果存储在全局变量中,然后在单独的函数中访问 db 变量,该函数不能保证仅在设置 db 变量后执行,这样浏览器发现您正在访问未初始化的变量。

解决方案很简单(但令人沮丧)。除非您想了解某些库对承诺和延迟对象的实现,否则不能以这种方式使用全局变量。相反,看看 Deni 给出的答案。使用回调并在回调函数中编写代码,而不是全局变量。 'db' 只能从回调 request.onsuccess 函数中访问,并且不是全局的。这就是为什么丹尼会起作用。他的代码只会在保证初始化(不为空)时尝试访问 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....
    };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从indexedDB获取对象存储? 的相关文章