有人可以建议如何从 IndexedDB objectstore 获取多个键值吗?我做了多种选择,但没有一个工作。
在此处创建 indexedDb
$provide.value('dbModel', {
name: 'TestDB',
version: '1',
instance: {},
objectStoreName: {
dashboards: 'Appointment'
},
upgrade: function (e) {
var db = e.target.result;
if (!db.objectStoreNames.contains('Appointment')) {
var calendarobj = db.createObjectStore('Appointment', {
keyPath: 'AppointmentId'
});
calendarobj.createIndex("AppointmentId", "AppointmentId", { multiEntry: true });
}
}
});
数据看起来像
KeyPath-AppointmentId Value
===================== =====
1 Test 1
2 Test 2
3 Test 3
我有 getObjectStore 方法来获取 objectstorename 实例。
getObjectStore: function (objectStoreName, mode) {
var modeact = mode || _db.transactionTypes.readonly;
var txn = _db.instance.transaction(objectStoreName, modeact);
var store = txn.objectStore(objectStoreName);
return store;
}
var keys = [1,2]; // Want to get the First two record which has value 'Test 1' and 'Test 2'
var store = _db.getObjectStore(objectStoreName);
var tagIndex = store.index(store.keyPath); //AppointmentId
var request = tagIndex.openCursor(IDBKeyRange.only(keys));
//var request = tagIndex.get(keys);
request.onsuccess = function (event) {
console.log(event.result);
}
最佳答案
像你一样使用 [1, 2]
是行不通的——这是一个键,它恰好是一个有两个成员的数组。索引数据库目前不理解使用列表或键集进行查询。
你有几个选择:
1 - 并行发出两个 get 请求。 (由于订单是有保证的,第二个请求将在第一个请求之后完成,并且您知道两个结果都将被返回。)
var results = [];
store.get(1).onsuccess = function(e) {
results.push(e.target.result);
};
store.get(2).onsuccess = function(e) {
results.push(e.target.result);
// results will have the values
};
2 - 使用光标和范围:
var results = [];
store.openCursor(IDBKeyRange.bound(1, 2)).onsuccess = function(e) {
var cursor = e.target.result;
if (cursor) {
results.push(cursor.value);
cursor.continue();
} else {
// results will have the values
}
};
3 - 使用具有范围的 getAll(仅适用于较新的浏览器 - 如果不可用,则退回到光标)
store.getAll(IDBKeyRange.bound(1, 2)).onsuccess = function(e) {
// e.target.result will have the entries
};
请注意,在使用范围的选项 2 和 3 中,如果存在,您还将获得键为
1.5
的记录。关于angularjs - 如何从IndexedDb对象存储中获取多个键值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41940722/