上篇讲了简单的创建了一个数据库和两个表,这里就详细记录下查询;
这里先定义二个数组对象
data(){
return {
arr:[
{id:1,name:'杨姐',age:18,sex:0},
{id:2,name:'骏驰',age:33,sex:0},
{id:3,name:'king',age:45,sex:1},
{id:4,name:'浩杰',age:16,sex:0},
{id:5,name:'浩B',age:89,sex:1},
{id:6,name:'浩A',age:56,sex:0},
],
arr1:[
{id:1,height:160,weight:50},
{id:2,height:150,weight:45},
{id:3,height:160,weight:70},
{id:4,height:170,weight:70},
{id:5,height:180,weight:75},
{id:6,height:180,weight:60},
],
db:null, // 全局的indexedDB数据库实例。
}
},
上面的db 在初始化数据库的时候 赋值了 this.db=e.target.result;
表一 yyyyy 键值id 索引就是里面的3个字段
表二 two 键值id 索引就是里面的3个字段
/ 读取数据
getData(){
let {db} = this;
// 创建一个事务
var request = db.transaction(['yyyyy'], 'readwrite').objectStore('yyyyy');
let myObj = request.get(5);
myObj.onsuccess = function (event) {
console.log('数据读取成功',event.target.result);
};
myObj.onerror = function (event) {
console.log('数据读取失败');
}
},
注:索引是可以不唯一出现多个的,例如年龄,你存的数据里可以出现多个年龄一样的人,返回结果是第一个人
/ 读取数据
getData(){
let {db} = this;
// 创建一个事务
var request = db.transaction(['yyyyy'], 'readwrite').objectStore('yyyyy');
// 单索引
let result = request.index('sex');
let myObj = request.get(0);
myObj.onsuccess = function (event) {
console.log('数据读取成功',event.target.result);
};
myObj.onerror = function (event) {
console.log('数据读取失败');
}
},
注:IDBKeyRange.only(1) 返回sex===1的
IDBKeyRange.lowerBound():指定下限。
IDBKeyRange.upperBound():指定上限。
IDBKeyRange.bound():同时指定上下限。
IDBKeyRange.only():指定只包含一个值。
// All keys ≤ x
var r1 = IDBKeyRange.upperBound(x);
// All keys < x
var r2 = IDBKeyRange.upperBound(x, true);
// All keys ≥ y
var r3 = IDBKeyRange.lowerBound(y);
// All keys > y
var r4 = IDBKeyRange.lowerBound(y, true);
// All keys ≥ x && ≤ y
var r5 = IDBKeyRange.bound(x, y);
// All keys > x &&< y
var r6 = IDBKeyRange.bound(x, y, true, true);
// All keys > x && ≤ y
var r7 = IDBKeyRange.bound(x, y, true, false);
// All keys ≥ x &&< y
var r8 = IDBKeyRange.bound(x, y, false, true);
// The key = z
var r9 = IDBKeyRange.only(z);
getIndexData(){
let {db} = this;
let newArr=[]
// 创建一个事务
var request = db.transaction(['yyyyy'], 'readwrite').objectStore('yyyyy');
// 单索引
let result = request.index('sex');
// 打开游标
let c = result.openCursor(IDBKeyRange.only(1)); //条件查询
c.onsuccess = function(e) {//成功执行回调
var cursor = e.target.result;
if (cursor){//如果存在
newArr.push(cursor)
cursor.continue();//继续下一个
}
}
},
如果条件比较多可以在onsuccess里面去判断,判断没有的话就是获取所有
let c = result.openCursor(); //条件查询
c.onsuccess = function(e) {//成功执行回调
var cursor = e.target.result;
if (cursor){//如果存在
if(cursor.key==1){
newArr.push(cursor)
}
cursor.continue();//继续下一个
}
}
},
功能 需查找 sex为0的人 身高高于160的 manyGet()
// 多表查询
async manyGet(){
// 需查找 sex为0的人 身高高于160的
let n = await this.getYYYY();
// 再启一个事务 查询two表
let newArr = [];
await Promise.all(n.map(async (item,index) => {
let two = await this.getTwo(item.id);
if(two){
Object.assign(item,two);
newArr.push(item)
}
}))
console.log(newArr);
},
getYYYY(){
return new Promise((resolve,reject)=>{
let {db} = this;
// 创建一个事务
var request = db.transaction(['yyyyy'], 'readwrite').objectStore('yyyyy');
// 单索引
let result = request.index('sex');
let newArr = []
// 打开游标
let c = result.openCursor(IDBKeyRange.only(0));
c.onsuccess = async (e) => {//成功执行回调
console.log('成功执行回调');
var cursor = e.target.result;
if (cursor){//如果存在
// console.log(cursor.key);//key是表的主键
var stu = cursor.value;
newArr.push(stu)
cursor.continue();//继续下一个
}else {
resolve(newArr)
}
}
})
},
getTwo(id){
return new Promise((resolve,reject)=>{
let {db} = this;
var mmm = db.transaction(['two'], 'readwrite').objectStore('two').get(id);
mmm.onsuccess = function (event) {
// console.log('多表查询',event);
let item = event.target.result;
console.log(1111);
if(item.height>160){
resolve(item)
}else{
resolve()
}
};
})
},