SQLite 通用操作工具 (SL-SqlLite.js)
插件市场
操作视频
基于 uni-appplus.sqlite的 Promise 化 SQLite 操作工具,仅支持App(5+)环境。非 App 环境(H5 / 小程序)调用任何方法会自动 reject 并弹窗提示。
快速开始
importdbfrom'@/SL-SqlLite/SL-SqlLite.js'// 1. 打开数据库awaitdb.openDatabase('mydb.db','_doc/')db.setCurrentDBName('mydb.db')// 2. 建表awaitdb.createTable('user','id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER')// 3. 新增awaitdb.insert('user',{name:'张三',age:25})// 4. 查询constlist=awaitdb.selectAll('user','*',null,'id DESC')constone=awaitdb.selectOne('user','id = 1')constcnt=awaitdb.count('user','age > 20')// 5. 修改awaitdb.update('user',{name:'李四',age:30},'id = 1')// 6. 删除awaitdb.remove('user','id = 1')// 7. 事务awaitdb.transaction(async()=>{awaitdb.insert('user',{name:'王五',age:28})awaitdb.insert('user',{name:'赵六',age:32})})// 8. 关闭awaitdb.closeDatabase('mydb.db')环境检测
if(!db.isApp()){constplatform=db.getPlatformName()// 'H5' | '微信小程序' | ...uni.showModal({title:'提示',content:`当前为${platform},无法使用 SQLite`})return}isApp()返回true时为 App 环境,false为其他平台非环境下调用任何数据库方法会自动弹窗提示并 reject,不会崩溃
API 一览
数据库管理
| 方法 | 参数 | 返回值 | 说明 |
|---|---|---|---|
openDatabase(name, path) | name: 库名如'mydb.db';path: 存放路径默认'_doc/' | Promise | 打开/创建数据库 |
closeDatabase(name) | name: 库名 | Promise | 关闭数据库 |
isOpenDatabase(name) | name: 库名 | Promise<Boolean> | 判断是否已打开 |
setCurrentDBName(name) | name: 库名 | - | 设置当前操作的数据库名 |
getCurrentDBName() | - | String | 获取当前数据库名(未设置时抛错) |
原始 SQL
| 方法 | 参数 | 返回值 | 说明 |
|---|---|---|---|
executeSql(sql) | 完整 SQL 字符串 | Promise | 执行 INSERT/UPDATE/DELETE/CREATE 等 |
selectSql(sql) | 完整 SELECT 语句 | Promise<Array> | 查询,返回行数组 |
注意:
plus.sqlite不支持?参数绑定,所有 SQL 需手动拼接完整值。便捷 CRUD 方法已内部处理。
便捷 CRUD
| 方法 | 参数 | 返回值 | 说明 |
|---|---|---|---|
insert(table, data) | table: 表名;data:{ col: val } | Promise | 插入单条,值自动转义 |
insertBatch(table, dataList) | dataList:[{ col: val }, ...] | Promise | 批量插入,事务包裹 |
update(table, data, where) | data: 更新字段;where: 如'id = 5' | Promise | 更新记录 |
remove(table, where) | where: 如'id = 1' | Promise | 删除记录 |
selectAll(table, columns, where, orderBy, limit) | 均可选 | Promise<Array> | 查询多条 |
selectOne(table, where) | where: 条件 | Promise<Object|null> | 查询单条 |
count(table, where) | where: 可选 | Promise<Number> | 查询记录数 |
表结构
| 方法 | 参数 | 返回值 | 说明 |
|---|---|---|---|
createTable(table, definition) | definition: 如'id INTEGER PRIMARY KEY, name TEXT' | Promise | 建表(IF NOT EXISTS) |
dropTable(table) | 表名 | Promise | 删表(DROP IF EXISTS) |
事务
| 方法 | 参数 | 返回值 | 说明 |
|---|---|---|---|
transaction(fn) | fn: async 函数,返回 Promise | Promise | 自动 BEGIN/COMMIT/ROLLBACK |
awaitdb.transaction(async()=>{awaitdb.insert('account',{name:'A',balance:100})awaitdb.insert('account',{name:'B',balance:200})// 若中途出错,自动 ROLLBACK,两条都不会写入})值转义说明
plus.sqlite.executeSql不支持?占位符绑定,工具内部通过toSqlValue()手动拼接:
| JS 类型 | SQL 输出 | 示例 |
|---|---|---|
number | 原值 | 25 |
boolean | 1/0 | 1 |
string | 单引号包裹,内部'转义为'' | '张三' |
null/undefined | NULL | NULL |
查询结果注意事项
plus.sqlite.selectSql返回的是native 代理对象,Vue 模板无法直接读取属性。查询后需浅拷贝为纯 JS 对象:
constrows=awaitdb.selectAll('user')// 推荐:浅拷贝后赋值给 Vue datathis.list=rows.map(r=>({id:r.id,name:r.name,age:r.age}))常见问题
-1402 Same Name Already Open
数据库已打开时重复调用openDatabase会报此错误。解决:先检查再打开。
constisOpen=awaitdb.isOpenDatabase('mydb.db')if(!isOpen){awaitdb.openDatabase('mydb.db')}中文乱码
SQLite 原生支持 UTF-8 中文存储,无需特殊处理。若出现乱码通常是 HTML/JS 文件编码问题,确保.vue/.js文件以 UTF-8 无 BOM 保存。
非环境调用
非 App 环境下调用任何方法会自动弹窗提示并 reject,不会崩溃:
SQLite 仅支持 App 环境运行,当前为 H5,无法使用数据库功能完整 API 导出
| 分类 | 方法 |
|---|---|
| 环境 | isApp,getPlatformName |
| 数据库 | openDatabase,closeDatabase,isOpenDatabase,setCurrentDBName,getCurrentDBName |
| SQL | executeSql,selectSql |
| CRUD | insert,insertBatch,update,remove,selectAll,selectOne,count |
| 表结构 | createTable,dropTable |
| 事务 | transaction |