gpt4 book ai didi

javascript - 在 Indexeddb 中获取和设置一个值

转载 作者:行者123 更新时间:2023-11-30 20:49:43 26 4
gpt4 key购买 nike

这看起来很简单,但由于某些原因不起作用

要求是

  • 查看Indexeddb中是否有具体值
  • 返回值
  • 如果值不存在或数据库不存在返回空或空
  • 如果返回空,创建数据库并设置值

看起来很简单,但遇到了 onupgradeneeded 问题,即使在手动删除数据库后也不会被调用

这是代码

  <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>

本地存储不是一种选择

最佳答案

有一些小问题,但如果您全神贯注解决这些问题,您的代码就可以正常工作。我们先来看一下SetItem:

var open = indexedDB.open("DB", 1);

这是一个异步调用 - 因此在对打开的数据库执行某些操作之前,您必须将 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 Dev Tools 控制台 (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 .

关于javascript - 在 Indexeddb 中获取和设置一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48314462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com