获取和设置Indexeddb中的值

nwnhqdif  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(1)|浏览(180)

这看起来很简单,但由于某些原因无法工作
要求为

  • 查看Indexeddb中是否有特定值
  • 返回值
  • 如果值不存在或DB不存在,则返回空或null
  • 如果返回为空,则创建DB并设置值

看起来很简单,但遇到了onupgradeneded问题,即使手动删除数据库后,也从未调用该问题
下面是代码

<script type="text/javascript">

    var id = GetItem();     

    if(id == null || id=="")
    {
        //based on some other logic 
        var GID = "test";

        SetItem(GID);
    }

    function GetItem() {

        var result = "";

        try {
               var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB;

                // Open  the database
                var open = indexedDB.open("DB", 1);

                open.onupgradeneeded = function () {
                    var db = open.result;
                    var store = db.createObjectStore("Store", { keyPath: "id" });                      
                };

                open.onsuccess = function () {
                    // Start a new transaction
                    var db = open.result;
                    var transaction = db.transaction("Store", "readwrite");
                    var store = transaction.objectStore("Store");

                     var gid = store.get("GID");
                     result = kid.result.value;

                };

                transaction.oncomplete = function () {
                    db.close();
                };                 
            }
            catch (err) {
                console.error(err.message);
            }          
        return result;
    }

    function SetItem(GID) {
        var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.shimIndexedDB;
        // Open (or create) the database
        var open = indexedDB.open("DB", 1);
        var transaction = db.transaction(["Store"]);
        var objectStore = transaction.objectStore("Store");
        objectStore.put({ id: "GID", value: GID });
        objectStore.onerror = function (event) {
            console.error(err.message);
        };
        request.onsuccess = function (event) {
            // Do something with the request.result!
            alert(request.result.value);
        };
           transaction.oncomplete = function () {
                    db.close();
                }; 
    }

</script>

本地存储不是一个选项

vktxenjb

vktxenjb1#

这里有一些小问题,但是如果你仔细考虑一下,你可以让代码正常工作。让我们先看看SetItem
var open = indexedDB.open("DB", 1);
这是一个异步调用--所以你必须在打开的db中附加onsuccessonerror。之后你把open引用为db,但是如果它是正确的,它仍然会抛出错误,因为open没有引用你的db。下面是我修复它的方法:

var open = indexedDB.open("DB", 1);
open.onerror = function(event) {
  console.log("Error loading database");
}
open.onsuccess = function(event) {
  var db = open.result;
  var transaction = db.transaction("Store", "readwrite");
  var objectStore = transaction.objectStore("Store");
  objectStore.put({ id: "GID", value: GID });
  /* ....... */
}

正如你所看到的,我还传递了“readwrite”给db.transaction。当你想把一个对象放到你的数据库中时,你必须这样做。还有一些其他的小问题-kid而不是gid。我通过进入Chrome开发工具控制台修复了大部分问题(ctrl+shift+i)和阅读错误-您也可以打开(Application -〉IndexedDB)并在运行代码之前删除它,以确保真正发生的事情。请记住,每次进行异步调用并希望读取响应时,都需要在调用完成时读取响应。代码中的另一个示例:

var gid = store.get("GID"); // here you make asynchronous call
result = kid.result.value;  // here you're trying to get result immediately

它应该如下所示:

var gid = store.get("GID");
gid.onsuccess = function(event) { /* ... */ }

IDB的API并不简单和直观-我不能推荐你足够的idb。这个库可以让你做IDB,但是用promises

相关问题