indexedDB的一个奇怪之处是带有不在objectstore中的键的objectStore.get()请求会生成一个带有(event.target.results == undefined)
的成功事件(参见:http://www.w3.org/TR/IndexedDB/#object-store get函数)
我需要捕获此类“success”并记录它。现在,我在返回的事件中找不到KEY。所以我正在做一个真正的黑客并将其存储在交易中。有什么建议吗?
var deferred = new jQuery.Deferred(); // this is what gets returned
var id = view.zoom + "-" + view.tile.column + "-" + view.tile.row;
trans = DB.transaction(["Images"], "readonly");
store = trans.objectStore("Images");
req = store.get(id);
trans._keyPathForGet = id; // hack
req.onsuccess = function (e) {
var blob = e.target.result;
if (blob == undefined) {
console.log("no blob of id: " + e.target.transaction._keyPathForGet);
deferred.resolve(null);
} else {
var imgURL = URL.createObjectURL(blob);
deferred.resolve(imgURL); // let leaflet know we're done, and give it the URL
URL.revokeObjectURL(imgURL); // not sure if we're revoking it too soon here
}
答案 0 :(得分:3)
这是用于组合键和键范围的过度紧凑的API设计的工件。您还可以找到删除ramdon键也获得成功事件,即使没有删除任何内容。我很好地返回键范围查询的成功,但关键查询应返回错误事件。
无论如何,对于这类问题,有很好的替代解决方案。最好的方法是使用光标。存储密钥不是问题,您可以保持功能关闭。
var getFile = function (id) {
...
var req = store.openCursor(id);
req.onsuccess = function(e) {
var cursor = e.target.result;
if (cursor) {
var blob = cursor.value;
...
} else {
var err = new Error();
err.name = 'NotFoundError';
err.id = id;
deferred.reject(err);
}
}
return deferred;
}
您还可以使用count
方法查询对象存储区中的密钥。