这看起来很简单,但由于某些原因无法工作
要求为
- 查看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>
本地存储不是一个选项
1条答案
按热度按时间vktxenjb1#
这里有一些小问题,但是如果你仔细考虑一下,你可以让代码正常工作。让我们先看看
SetItem
:var open = indexedDB.open("DB", 1);
这是一个异步调用--所以你必须在打开的db中附加
onsuccess
和onerror
。之后你把open
引用为db
,但是如果它是正确的,它仍然会抛出错误,因为open
没有引用你的db。下面是我修复它的方法:正如你所看到的,我还传递了“readwrite”给
db.transaction
。当你想把一个对象放到你的数据库中时,你必须这样做。还有一些其他的小问题-kid
而不是gid
。我通过进入Chrome开发工具控制台修复了大部分问题(ctrl+shift+i)和阅读错误-您也可以打开(Application -〉IndexedDB)并在运行代码之前删除它,以确保真正发生的事情。请记住,每次进行异步调用并希望读取响应时,都需要在调用完成时读取响应。代码中的另一个示例:它应该如下所示:
IDB的API并不简单和直观-我不能推荐你足够的idb。这个库可以让你做IDB,但是用promises。