更新记录

1.0.0(2026-09-03) 下载此版本

初版


平台兼容性

uni-app(3.8.3)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - - - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

其他

多语言 暗黑模式 宽屏模式

SQLite 通用操作工具 (SL-SqlLite.js)

基于 uni-app plus.sqlite 的 Promise 化 SQLite 操作工具,仅支持 App(5+) 环境。非 App 环境(H5 / 小程序)调用任何方法会自动 reject 并弹窗提示。

快速开始

import db from '@/SL-SqlLite/SL-SqlLite.js'

// 1. 打开数据库
await db.openDatabase('mydb.db', '_doc/')
db.setCurrentDBName('mydb.db')

// 2. 建表
await db.createTable('user', 'id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER')

// 3. 新增
await db.insert('user', { name: '张三', age: 25 })

// 4. 查询
const list = await db.selectAll('user', '*', null, 'id DESC')
const one  = await db.selectOne('user', 'id = 1')
const cnt  = await db.count('user', 'age > 20')

// 5. 修改
await db.update('user', { name: '李四', age: 30 }, 'id = 1')

// 6. 删除
await db.remove('user', 'id = 1')

// 7. 事务
await db.transaction(async () => {
  await db.insert('user', { name: '王五', age: 28 })
  await db.insert('user', { name: '赵六', age: 32 })
})

// 8. 关闭
await db.closeDatabase('mydb.db')

环境检测

if (!db.isApp()) {
  const platform = 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
await db.transaction(async () => {
  await db.insert('account', { name: 'A', balance: 100 })
  await db.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 对象:

const rows = await db.selectAll('user')
// 推荐:浅拷贝后赋值给 Vue data
this.list = rows.map(r => ({ id: r.id, name: r.name, age: r.age }))

常见问题

-1402 Same Name Already Open

数据库已打开时重复调用 openDatabase 会报此错误。解决:先检查再打开。

const isOpen = await db.isOpenDatabase('mydb.db')
if (!isOpen) {
  await db.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

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议