Javascript indexedDB中的算子内等价
我想执行这个查询 从propertyCode所在的属性中选择*(“field1”、“field2”、“field3”) 如何在IndexedDB中实现这一点 我试过这个东西Javascript indexedDB中的算子内等价,javascript,range,indexeddb,Javascript,Range,Indexeddb,我想执行这个查询 从propertyCode所在的属性中选择*(“field1”、“field2”、“field3”) 如何在IndexedDB中实现这一点 我试过这个东西 getData:function(indexName、params、objectStoreName){ var defer=$q.defer(), 数据库、事务、索引、游标请求、请求、对象存储、结果集、数据列表=[]; 请求=indexedDB.open('test'); request.onsuccess=函数(事件){
getData:function(indexName、params、objectStoreName){
var defer=$q.defer(),
数据库、事务、索引、游标请求、请求、对象存储、结果集、数据列表=[];
请求=indexedDB.open('test');
request.onsuccess=函数(事件){
db=请求。结果;
transaction=db.transaction(objectStoreName);
objectStore=transaction.objectStore(objectStoreName);
index=objectStore.index(indexName);
cursorRequest=index.openCursor(仅IDBKeyRange.only(params));
cursorRequest.onsuccess=函数(){
结果集=cursorRequest.result;
如果(结果集){
dataList.push(resultSet.value);
resultSet.continue();
}
否则{
console.log(数据列表);
延迟解析(数据列表);
}
};
cursorRequest.onerror=函数(事件){
log(“打开光标时出错”);
}
}
request.onerror=函数(事件){
log('无法访问executeQuery中的数据库');
}
返回延迟。承诺;如果你认为In本质上等同于代码> Field1==PrimeType或Field2==PrimeTyCys<代码>,那么你可以说In只是另一种使用或./P>的方式。
IndexedDB无法从单个请求执行或(联合)
一般来说,你唯一的选择是做单独的请求,然后将它们合并到内存中。一般来说,这将不会有很好的性能。如果你正在处理很多对象,你可能会考虑完全放弃这种方法,并思考如何避免这样的方法。
另一种方法是迭代内存中的所有对象,然后过滤那些不符合条件的对象。同样,性能糟糕
下面是一个可能给您带来不错性能的噱头,但它需要一些额外的工作和一点点存储开销:
- 在对象中存储一个额外字段。例如,计划使用名为
的属性hasPropertyCodeX
- 只要3个属性中的任何一个为true(代码正确),就设置字段(如中所示,只需将其作为对象的属性,其值是无关的)
- 当这3个属性都不为真时,请从对象中删除该属性
- 每当修改对象时,更新派生属性(根据需要设置或取消设置)
- 在indexedDB中为此派生属性创建索引
- 在索引上打开光标。只有属性存在的对象才会显示在光标结果中
第三种方法的示例
如果您认为In本质上等同于代码> Field1= = PrimeType或Field2==PrimeTyCys<代码>,那么您可以说In只是另一种使用或./P>的方式。
IndexedDB无法从单个请求执行或(联合)
一般来说,你唯一的选择是做单独的请求,然后将它们合并到内存中。一般来说,这将不会有很好的性能。如果你正在处理很多对象,你可能会考虑完全放弃这种方法,并思考如何避免这样的方法。
另一种方法是迭代内存中的所有对象,然后过滤那些不符合条件的对象。同样,性能糟糕
下面是一个可能给您带来不错性能的噱头,但它需要一些额外的工作和一点点存储开销:
- 在对象中存储一个额外字段。例如,计划使用名为
的属性hasPropertyCodeX
- 只要3个属性中的任何一个为true(代码正确),就设置字段(如中所示,只需将其作为对象的属性,其值是无关的)
- 当这3个属性都不为真时,请从对象中删除该属性
- 每当修改对象时,更新派生属性(根据需要设置或取消设置)
- 在indexedDB中为此派生属性创建索引
- 在索引上打开光标。只有属性存在的对象才会显示在光标结果中
第三种方法的示例
什么是objectStore?在哪里定义itI已经更新了代码..请检查作为参数传递的是什么?IDBKeyRange.only()生成一个只跨一个键的范围。因此,此游标将只生成一条记录。如果您希望参数是要获取的键的列表,您可以简单地在参数上迭代并发出get()对于每一个。我如何在列表上进行迭代?请编写一个示例代码。什么是objectStore?在哪里定义itI?我已经更新了代码。请检查作为参数传递的是什么?IDBKeyRange.only()生成一个仅跨单个键的范围。因此,此游标将只生成一条记录。如果您希望params成为要获取的键的列表,则只需在params上迭代并发出get()对于每一个。我如何迭代列表?你能写一个示例代码吗?谢谢回复@Josh。但我无法实现。你能写一个示例代码吗。这将是一个很大的帮助。谢谢回复@Josh。但我无法实现。你能写一个示例代码吗。这将是一个很大的帮助。
var request = indexedDB.open(...);
request.onupgradeneeded = upgrade;
function upgrade(event) {
var db = event.target.result;
var store = db.createObjectStore('store', ...);
// Create another index for the special property
var index = store.createIndex('hasPropCodeX', 'hasPropCodeX');
}
function putThing(db, thing) {
// Before storing the thing, secretly update the hasPropCodeX value
// which is derived from the thing's other properties
if(thing.field1 === 'propCode' || thing.field2 === 'propCode' ||
thing.field3 === 'propCode') {
thing.hasPropCodeX = 1;
} else {
delete thing.hasPropCodeX;
}
var tx = db.transaction('store', 'readwrite');
var store = tx.objectStore('store');
store.put(thing);
}
function getThingsWherePropCodeXInAnyof3Fields(db, callback) {
var things = [];
var tx = db.transaction('store');
var store = tx.objectStore('store');
var index = store.index('hasPropCodeX');
var request = index.openCursor();
request.onsuccess = function(event) {
var cursor = event.target.result;
if(cursor) {
var thing = cursor.value;
things.push(thing);
cursor.continue();
} else {
callback(things);
}
};
request.onerror = function(event) {
console.error(event.target.error);
callback(things);
};
}
// Now that you have an api, here is some example calling code
// Not bothering to promisify it
function getData() {
var request = indexedDB.open(...);
request.onsuccess = function(event) {
var db = event.target.result;
getThingsWherePropCodeXInAnyof3Fields(db, function(things) {
console.log('Got %s things', things.length);
for(let thing of things) {
console.log('Thing', thing);
}
});
};
}