uniapp使用sqlite数据库做离线缓存功能

前期工作

  • manifest.json 中打开 SQLite 数据库
    在这里插入图片描述
  • 创建数据库存储文件
    在这里插入图片描述

开始封装 sqlite.js

module.exports = {
  dbName: 'chat', // 数据库名称
  dbPath: '_doc/chat.db', // 数据库地址
  // 判断数据库是否打开
  isOpen() {
    let open = plus.sqlite.isOpenDatabase({
      name: this.dbName,
      path: this.dbPath
    })
    return open
  },
  // 创建数据库,如果存在数据库就打开
  openSqlite() {
    return new Promise((resolve, reject) => {
      plus.sqlite.openDatabase({
        name: this.dbName,
        path: this.dbPath,
        success: (res) => {
          resolve(res)
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  },
  // 关闭数据库
  closeSqlite() {
    return new Promise((resolve, reject) => {
      plus.sqlite.closeDatabase({
        name: this.dbName,
        success: (res) => {
          resolve(res)
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  },
  /* 数据库建表 sql: 'CREATE TABLE IF NOT EXISTS dbTable("id" varchar(50),"name" TEXT) 
  创建 CREATE TABLE IF NOT EXISTS、 dbTable 是表名, 不能用数字开头、 括号里是表格的表头 */
  createTable(dbTable, data) {
    return new Promise((resolve, reject) => {
      plus.sqlite.executeSql({
        name: this.dbName,
        sql: `CREATE TABLE IF NOT EXISTS ${dbTable}(${data})`,
        success: (res) => {
          console.log('创建数据库表', res);
          resolve(res)
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  },
  // 数据库删表 
  dropTable(dbTable) {
    return new Promise((resolve, reject) => {
      plus.sqlite.executeSql({
        name: this.dbName,
        sql: `DROP TABLE ${dbTable}`,
        success: (res) => {
          resolve(res)
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  },
  /* 向表格里添加数据 sql:'INSERT INTO dbTable VALUES('x','x','x')'   对应新增
   或者 sql:'INSERT INTO dbTable ('x','x','x') VALUES('x','x','x')'   具体新增
   插入 INSERT INTO  、 dbTable 是表名、根据表头列名插入列值 */
  insertTableData(dbTable, data, condition) {
    // 判断有没有传参
    if (dbTable !== void 0 && data !== void 0) {
      // 判断传的参是否有值
      let bol = (JSON.stringify(data) == '{}')
      if (!bol) {
        let sql = condition == void 0 ? `INSERT INTO ${dbTable} VALUES('${data}')` :
          `INSERT INTO ${dbTable} (${condition}) VALUES(${data})`
        return new Promise((resolve, reject) => {
          // 表格添加数据
          plus.sqlite.executeSql({
            name: this.dbName,
            sql,
            success: (res) => {
              resolve(res)
            },
            fail: (err) => {
              reject(err)
            }
          })
        })
      } else {
        return new Promise((resolve, reject) => {
          reject('错误添加')
        })
      }
    } else {
      return new Promise((resolve, reject) => {
        reject('错误添加')
      })
    }
  },
  /* 根据条件向表格里添加数据  有数据更新、无数据插入
  (建表时需要设置主键) 例如 --- "roomid" varchar(50) PRIMARY KEY */
  insertOrReplaceData(dbTable, data, condition) {
    // 判断有没有参数
    if (dbTable !== void 0 && data !== void 0) {
      let sql = condition == void 0 ? `INSERT OR REPLACE INTO ${dbTable} VALUES('${data}')` :
        `INSERT OR REPLACE INTO ${dbTable} (${condition}) VALUES(${data})`;
      return new Promise((resolve, reject) => {
        plus.sqlite.executeSql({
          name: this.dbName,
          sql,
          success: (res) => {
            resolve(res)
          },
          fail: (err) => {
            reject(err)
          }
        })
      })
    } else {
      return new Promise((resolve, reject) => {
        reject('错误添加')
      })
    }
  },
  /* 查询获取数据库里的数据 sql:'SELECT * FROM dbTable WHERE lname = 'lvalue''
  查询 SELECT * FROM 、 dbTable 是表名、 WHERE 查找条件 lname,lvalue 是查询条件的列名和列值 */
  selectTableData(dbTable, uname, namevalue, upass, passvalue, urrn, rrnvalue) {
    if (dbTable !== undefined) {
      // 第一个是表单名称,后两个参数是列表名,用来检索
      if (uname !== undefined && upass !== undefined && urrn !== undefined) {
        // 三个检索条件
        var sql =
          `SELECT * FROM ${dbTable} WHERE ${uname} = '${namevalue}' AND ${upass} = '${passvalue}' AND ${urrn}='${rrnvalue}'`;
      }
      if (uname !== undefined && upass !== undefined && urrn == undefined) {
        // 两个检索条件
        var sql = `SELECT * FROM ${dbTable} WHERE ${uname} = '${namevalue}' AND ${upass} = '${passvalue}'`;
      }
      if (uname !== undefined && upass == undefined && urrn == undefined) {
        // 一个检索条件
        var sql = `SELECT * FROM ${dbTable} WHERE ${uname} = '${namevalue}'`;
        // console.log(sql);
      }
      if (uname == undefined) {
        var sql = `SELECT * FROM ${dbTable}`;
      }
      return new Promise((resolve, reject) => {
        // 表格查询数据  执行查询的SQL语句
        plus.sqlite.selectSql({
          name: this.dbName,
          sql: sql,
          success(e) {
            resolve(e);
          },
          fail(e) {
            reject(e);
          }
        })
      })
    } else {
      return new Promise((resolve, reject) => {
        reject('错误查询')
      });
    }
  },
  /* 删除表里的数据 sql:'DELETE FROM dbTable WHERE lname = 'lvalue''
  删除 DELETE FROM 、 dbTable 是表名、 WHERE 查找条件 lname,lvalue 是查询条件的列名和列值 */
  deleteTableData(dbTable, lname, lvalue, ww, ee) {
    if (dbTable !== void 0) {
      if (lname == void 0) {
        var sql = `DELETE FROM ${dbTable}`;
      } else {
        // ww !== void 0 ? 两个检索条件 :一个检索条件 
        var sql = ww !== void 0 ? `DELETE FROM ${dbTable} WHERE ${lname} = '${lvalue}' AND ${ww} = '${ee}'` :
          `DELETE FROM ${dbTable} WHERE ${lname} = '${lvalue}'`;
      }
      return new Promise((resolve, reject) => {
        // 删除表格 
        plus.sqlite.executeSql({
          name: this.dbName,
          sql,
          success: (res) => {
            resolve(res)
          },
          fail: (err) => {
            reject(err)
          }
        })
      })
    } else {
      return new Promise((resolve, reject) => {
        reject('错误删除')
      })
    }
  },
  /* 修改数据表里的数据 sql:"UPDATE dbTable SET 列名 = '列值',列名 = '列值' WHERE lname = 'lvalue'"
  修改 UPDATE 、 dbTable 是表名, data: 要修改的列名=修改后列值, lname,lvalue 是查询条件的列名和列值 */
  updateTableData(dbTable, data, lname, lvalue) {
    let sql = lname == void 0 ? `UPDATE ${dbTable} SET ${data}` :
      `UPDATE ${dbTable} SET ${data} WHERE ${lname} = '${lvalue}'`;
    // WHERE 前面是要修改的列名、列值,后面是条件的列名、列值
    return new Promise((resolve, reject) => {
      // 修改数据
      plus.sqlite.executeSql({
        name: this.dbName,
        sql,
        success: (res) => {
          resolve(res)
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  },
  /* 获取指定数据条数  sql:"SELECT * FROM dbTable ORDER BY 'id' DESC LIMIT 15 OFFSET 'num'"
  dbTable 表名, ORDER BY 代表排序默认正序, id 是排序的条件 DESC 代表倒序,从最后一条数据开始拿
  LIMIT 15 OFFSET '${num}',这句的意思是跳过 num 条拿 15 条数据, num 为跳过多少条数据是动态值
  例 初始num设为0,就从最后的数据开始拿15条,下次不拿刚获取的数据,所以可以让num为15,这样就能一步一步的拿完所有的数据 */
  pullSQL(dbTable, id, num) {
    return new Promise((resolve, reject) => {
      plus.sqlite.selectSql({
        name: this.dbName,
        sql: `SELECT * FROM ${dbTable} ORDER BY ${id} DESC LIMIT 15 OFFSET ${num}`,
        success: (res) => {
          resolve(res)
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  }
}

使用 SQLite

  • 导入 sqlite
import DB from '@/utils/sqlite.js'
  • 打开数据库
openSQL() {
  let open = DB.isOpen();
  if (!open) {
  	DB.openSqlite()
  	.then(() => {
  	  console.log('数据库打开')	
	})
	.catch(() => {
	  console.log('数据库关闭')
	})
  }
}
  • 关闭数据库
closeSQL() {
  let open = DB.isOpen();
  if (open) {
  	DB.closeSqlite()
  	.then(() => {
  	  console.log("数据库已关闭");
  	})
  	.catch(() => {
  	  console.log("数据库关闭失败");
  	})
  }
}
  • 创建表
createTable() {
  let open = DB.isOpen();
  if (open) {
  	this.openSQL();
  	/**
     * id: 为一个 主键 id 
     * INTEGER PRIMARY KEY AUTOINCREMENT 自动生成一个自增的主键 id 
     * name...: 则是表内的键名
     */
  	let sql = '"id" INTEGER PRIMARY KEY AUTOINCREMENT,"name" text,"content" text,"time" text';
  	// 创建表 DB.createTable(表名,表的列)
  	DB.createTable('chat', sql)
  	.then(() => {
  	  console.log('创建 chat 表成功')
  	})
  	.catch(() => {
  	  console.log('创建表失败')
  	})
  } else {
  	console.log('数据库未打开')
  }
},
  • 删除表
detaleTable() {
  let open = DB.isOpen();
  if (open) {
    DB.dropTable('chat')
    .then(res => {
      console.log('删除表成功', res);
    })
    .catch(err => {
      console.log('删除表失败');
    })
  }
}
  • 查询表数据
selectTableData() {
  let open = DB.isOpen();
  if (open) {
    // 查询表 DB.selectTableData(表名,查询条件列名,查询条件列值)
    DB.selectTableData('chat')
    .then(res => {
      console.log('contact', res);
    })
    .catch(err => {
      console.log('查询失败');
    })
  } else {
    console.log('数据库未打开');
  }
}
  • 向表格里添加数据
insertTableData() {
  let open = DB.isOpen();
  if (open) {
    let arr = [
      { name: '小明', content: "你好呀" },
      { name: '小红', content: "HI" }
    ]
    arr.map(v => {
      let time = new Date().getTime();
      let sql = `'${v.name}','${v.content}','${time}'`;
      let condition = "'name','content','time'";
      DB.insertOrReplaceData('chat', sql, condition)
      .then(res => {
        console.log('添加成功', res);
        this.selectTableData()
      })
      .catch(err => {
        console.log('添加失败');
      })
  } else {
    console.log('数据库未打开');
  }
}
  • 根据条件向表格里添加数据 有数据更新、无数据插入
    • 需要更新数据则需要传主键 id
    • 不传主键 id 则继续向后添加
insertOrReplaceData() {
  let open = DB.isOpen()
  if (open) {
    let arr = [
      {id: 1, name: '小明呀!', content: "你好呀!" },
    ]
    arr.map(v => {
      let time = new Date().getTime();
      let sql = `'${v.id}','${v.name}','${v.content}','${time}'`;
      let condition = "'id','name','content','time'";
      DB.insertOrReplaceData('chat', sql, condition)
      .then(res => {
        console.log('新增成功', res);
        this.selectTableData()
      })
      .catch(err => {
        console.log('新增失败');
      })
    })
  } else {
    console.log('数据库未打开');
  }
},
  • 删除表数据
deleteTableData() {
  let open = DB.isOpen()
  if (open) {
    DB.deleteTableData('chat', 'name', '小明')
    .then(res => {
      console.log('删除表数据成功');
    })
    .catch(err => {
      console.log('删除失败');
    })
  } else {
    console.log('数据库未打开');
  }
},
  • 修改表数据
updateTableData() {
  let open = DB.isOpen()
  if (open) {
    let time = new Date().getTime();
    let data = `content = '我被修改了',time = '${time}'`;
    // 修改表数据 DB.updateTableData(表名, 要修改的列名=修改后列值, 修改条件的列名, 修改条件的列值)
    DB.updateTableData('chat', data, 'name', '小明')
    .then(res => {
      console.log('数据库更新成功');
    })
    .catch(err => {
      console.log('数据库更新失败');
    })
  } else {
    console.log('数据库未打开');
  }
},
  • 获取指定数据条数
pullSQL() {
  let open = DB.isOpen();
  if (open) {
    DB.pullSQL('chat', 'id', 1)
    .then(res => {
      console.log(res, '@@@');
    })
    .catch(err => {
      console.log(err, '!!!');
    })
  }
},
  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值