如何从indexedDB获取对象存储?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (10)
EN

我的应用程序上有用于web存储的indexedDb。

我想从下面的代码中获得商店。

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

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

错误是

Uncaught TypeError: Cannot call method 'transaction' of null

我用断点试过了。在这种情况下,它工作得很好,没有错误。

我怎样才能找到那家商店?请帮帮我。

提前感谢!

kirankumar提问于
EN
Bailey BrightmanDeni Spasovski回答于

简而言之,为了从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);
        };
};
EN
Bailey BrightmanJosh回答于

错误可能是因为您的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....
    };
}
EN

可能回答问题的人

  • 云存储

    腾讯云 · 云存储 (已认证)

    75 粉丝0 提问0 回答
  • galen

    腾讯 · 高级工程师 (已认证)

    10 粉丝0 提问41 回答
  • Jinqn

    腾讯 · 高级工程师 (已认证)

    28 粉丝0 提问65 回答
  • 腾讯云技术服务团队

    腾讯云 · 技术服务团队 (已认证)

    48 粉丝0 提问8 回答
  • elliswu

    腾讯计算机系统有限公司 · 高级工程师 (已认证)

    6 粉丝0 提问0 回答
  • 杨泽华

    腾讯云 · 高级解决方案架构师 (已认证)

    26 粉丝0 提问0 回答

扫码关注云+社区

领取腾讯云代金券