Angularjs 角度索引中的自定义查询
我正在我的应用程序中使用。基本CRUD操作工作正常,但自定义查询未按预期工作。 我正在使用代码Angularjs 角度索引中的自定义查询,angularjs,indexeddb,Angularjs,Indexeddb,我正在我的应用程序中使用。基本CRUD操作工作正常,但自定义查询未按预期工作。 我正在使用代码 angular.module('myModuleName', ['indexedDB']) .config(function ($indexedDBProvider) { $indexedDBProvider .connection('myIndexedDB') .upgradeDatabase(1, function(event,
angular.module('myModuleName', ['indexedDB'])
.config(function ($indexedDBProvider) {
$indexedDBProvider
.connection('myIndexedDB')
.upgradeDatabase(1, function(event, db, tx){
var objStore = db.createObjectStore('people', {keyPath: 'ssn'});
objStore.createIndex('name_idx', 'age', {unique: false});
objStore.createIndex('name_idx, age_idx', ['name', 'age'] , {unique: false});
});
基本查询操作的工作原理如下
$indexedDB.openStore('people', function(x){
var find = x.query();
find = find.$eq('John');
find = find.$index("name_idx");
x.eachWhere(find).then(function(e){
$scope.list= e;
});
});
这将导致以下查询
select * from people where name='John'
但是,在上面的场景中,我们如何执行像
select * from people where name='John' and age='25';
delete from people where name='John' and age='25';
您正在使用的库没有复杂的查询,但是您可以为它编写一个纯js解决方案,类似如下: 首先,您需要将索引定义为:
objStore.createIndex('name_age_idx', ['name', 'age'] , {unique: false});
然后,您可以只对那些与搜索结果匹配的值进行搜索查询
searchIndexedDB=函数(名称、年龄、回调){
var request=indexedDB.open(dbName);
request.onsuccess=函数(e){
var db=e.target.result;
var trans=db.transaction(objectStoreName,'readonly');
var store=trans.objectStore(objectStoreName);
var index=store.index('name_age_idx');
var keyRange=IDBKeyRange.only([姓名,年龄]);
//打开具有相同名称和年龄的所有对象的索引
var openCursorRequest=index.openCursor(keyRange);
openCursorRequest.onsuccess=函数(e){
让结果=e.target.result;
//首先检查是否找到值
如果(结果){
回调(result.value);//每个对象都将调用您的回调
//result.delete()-删除对象
result.continue();//继续-调用下一个游标请求
}
};
trans.oncomplete=函数(e){
db.close();
};
openCursorRequest.onerror=函数(e){
log(“获取错误:”,e);
};
};
request.onerror=myStorage.indexedDB.onerror;
}
您正在使用的库没有复杂的查询,但是您可以为它编写一个纯js解决方案,类似如下:
首先,您需要将索引定义为:
objStore.createIndex('name_age_idx', ['name', 'age'] , {unique: false});
然后,您可以只对那些与搜索结果匹配的值进行搜索查询
searchIndexedDB=函数(名称、年龄、回调){
var request=indexedDB.open(dbName);
request.onsuccess=函数(e){
var db=e.target.result;
var trans=db.transaction(objectStoreName,'readonly');
var store=trans.objectStore(objectStoreName);
var index=store.index('name_age_idx');
var keyRange=IDBKeyRange.only([姓名,年龄]);
//打开具有相同名称和年龄的所有对象的索引
var openCursorRequest=index.openCursor(keyRange);
openCursorRequest.onsuccess=函数(e){
让结果=e.target.result;
//首先检查是否找到值
如果(结果){
回调(result.value);//每个对象都将调用您的回调
//result.delete()-删除对象
result.continue();//继续-调用下一个游标请求
}
};
trans.oncomplete=函数(e){
db.close();
};
openCursorRequest.onerror=函数(e){
log(“获取错误:”,e);
};
};
request.onerror=myStorage.indexedDB.onerror;
}
查看该提供程序的源代码,该提供程序似乎只对单个键执行查询。您可能需要修改该提供程序的源代码并编写自己的多键查询函数,或者在客户端编写筛选器以排除额外数据。对不起,我是indexeddb中的新手。我们不能使用配置的索引组合获取这些详细信息吗?例如,objStore.createIndex('name_idx,age_idx',['name','age'],{unique:false});查看该提供程序的源代码,该提供程序似乎只对单个键执行查询。您可能需要修改该提供程序的源代码并编写自己的多键查询函数,或者在客户端编写筛选器以排除额外数据。对不起,我是indexeddb中的新手。我们不能使用配置的索引组合获取这些详细信息吗?例如,objStore.createIndex('name_idx,age_idx',['name','age'],{unique:false});