在indexeddb上,我想查看是否有密钥permanent
并执行某些操作。但如果没有,我想做一些其他的行动。如果permanent
存在,我可以执行操作,但是如果不存在,我可以让错误工作。 onerror
是否想要做这件事?如何检查其中是否没有值?
var hashtype='permanent';
var getPermanent = store.get(hashtype);
getPermanent.onsuccess = function() {
var ivrame=getPermanent.result.value;
};
getPermanent.onerror = function() {
console.log('onerror')
};
答案 0 :(得分:5)
请参阅https://w3c.github.io/IndexedDB/#dom-idbobjectstore-get下的注释 - 如果没有匹配的记录,get
方法会使undefined
成功。
所以你有几个选择:
get(key)
并测试undefined
的结果。除非undefined
是您希望存储的值(它是有效值)count(key)
- 如果存在则结果为1,如果不存在则结果为0。如果您只是为了存在而进行测试,那就太容易了,但是没有给您带来记录。openCursor(key)
并测试以查看请求的result
是否为游标(记录显示为request.result.value
)或undefined
(范围内无记录)代码:
var hashtype='permanent';
// #1: Use get
var getPermanent = store.get(hashtype);
getPermanent.onsuccess = function() {
if (getPermanent.result === undefined) {
// no record with that key
} else {
var value = getPermanent.result;
}
};
// #2: Use count
var getPermanent = store.count(hashtype);
getPermanent.onsuccess = function() {
if (getPermanent.result === 0) {
// no record with that key
} else {
...
}
};
// #3: Use cursor
var getPermanent = store.openCursor(hashtype);
getPermanent.onsuccess = function() {
var cursor = getPermanent.result;
if (!cursor) {
// no record with that key
} else {
var value = cursor.value;
}
};
答案 1 :(得分:0)
分配给request.onsuccess的函数是一个始终被调用的回调函数,无论该值是否存在于商店中。当商店中没有相应的对象时,结果对象将是未定义的。当商店中有相应的对象时,将定义结果对象。因此,您只需要检查是否在onsuccess回调函数中定义了对象。
request.onerror是request.onsuccess的单独回调。当indexedDB中存在某种类型的失败时会调用onerror(例如,您尝试从不存在的商店中获取值,或者您试图将重复的对象放入不存在的商店中允许重复)。 request.onerror在调用store.get时没有找到值时会调用 not ,因为这不会被视为错误'在失败的意义上。
所以,你想要做的是这样的事情:
var hashtype='permanent';
var getPermanent = store.get(hashtype);
getPermanent.onsuccess = function(event) {
//var ivrame=getPermanent.result.value;
var result = getPermanent.result;
if(result) {
console.log('Got a result!', result);
var ivrame = result;
} else {
console.log('Result was undefined! No matching object found');
}
};
getPermanent.onerror = function() {
console.log('Something went wrong trying to perform the get request');
};
请勿尝试访问request.result.value。在获取请求的情况下没有这样的事情。当使用store.get时,request.result包含您想要的匹配对象,或者是未定义的。当使用store.openCursor时,request.result包含游标,如果至少有一个匹配对象并且您尚未迭代它,则定义游标。要在光标的当前位置获取匹配对象,可以使用cursor.value。在这里,将始终定义cursor.value,因为否则游标将是未定义的,您显然会事先检查它。
答案 2 :(得分:0)
与其使用getPermanent.result
来访问'get'请求提供的数据,不如使用event.target.result.
,它也可以与undefined进行比较,以检查是否缺少请求的密钥:
db = this.result;
var tr = db.transaction("data");
var objstore = tr.objectStore("data");
var getres = objstore.get(0);
getres.onsuccess = function(event)
{
if(event.target.result.data === undefined)
console.log("key not found");
}