更新记录
1.1.9(2026-10-14)
- 新增可选 Promise 接口:打开、关闭、参数化读写、结构化 CRUD 和批处理可使用 async / await;原有回调接口继续保留,失败返回原有 SqliteFail。
- 新增 executeMany / executeManyAsync,同一 SQL 模板绑定多组参数,写入前整批校验,默认整批事务;Android、iOS 一次准备重复执行,支持汇总和逐条摘要。Harmony 支持 API 12 的批量更新/删除,插入使用原 batchAsync;Web、小程序按基础 SQL 子集降级。
- 新增默认关闭的操作耗时与慢操作摘要,可配置 1–500 条缓存;摘要不记录库名、SQL、参数或数据,getDiagnostics 返回独立快照,clearDiagnostics 同时清空。
- 修复 iOS 蒸汽模式下查询记录字段丢失、Promise 失败无法读取错误码及回滚详情的问题;保持原有调用方式。
- 修复 iOS 批量写入未传事务选项时未按默认值回滚,以及 null 参数被拒绝的问题;保留显式关闭事务后的部分成功语义。
- 修复 iOS 显式传入 true/false 事务选项被误拒,以及首次迁移时空版本记录被误判为无效整数的问题。
- 修复当前 Android 编译器下原生错误属性初始化及结构化 CRUD 转交参数缺少明确类型的问题,保留原调用方式和业务语义。
- 修复完整示例在 Web 中导入 App 专属系统另存为接口的问题;App 保留原文件备份恢复流程,其他端提示使用 JSON 导入导出。
- 修复演示页面自检标题对比度不足、快捷按钮文字被截断的问题。
- 完善 uni-app、uni-app x 完整示例及内置组件,新增独立示例库的 500 条导入、异步查询、增改删体验、诊断开关和结果展示,统一两套完整页面的模块顺序、按钮分组和日志区;README 按业务模块提供最小示例、参数与平台范围。
- 本版本尚未发布。原有调用无需修改;App 使用包含当前插件原生代码的自定义基座或重新打包,不能只更新 WGT;Web 和小程序重新编译即可。
1.1.8(2026-09-20)
- 新增与
lizhao-choose-file联动的 uni-app、uni-app x 示例和说明,可将沙盒数据库备份另存到系统文件位置,也可把系统备份复制到沙盒后恢复;SQLite 公共调用方式不变。 - 修复 uni-app 示例把 Android、iOS 恢复流程写成无效条件编译,导致恢复前未关闭数据库、恢复后未重新打开的问题;统一使用
APP-PLUS,无需修改调用代码。 - 修复 Android 正常关闭数据库后遗留的 PERSIST 回滚日志被误判为数据库仍在占用的问题;只清理目标库头部已清零的失效 journal,WAL、SHM、有效回滚日志和源备份伴随文件仍会拒绝,避免覆盖活跃数据库。
- 优化 README 的介绍、功能特色、适用场景、示例位置、模块教程、API 查询资料和常见问题顺序,方便从最小接入逐步查阅完整能力。
- 本版本尚未发布。升级后无需修改调用代码或项目配置;Android 原生文件恢复逻辑已变化,需要重新制作并安装 Android 自定义基座或重新打包,不能仅更新 WGT。iOS、Harmony、Web 和小程序无需因本次修复重新制作原生包。
1.1.7(2026-09-19)
- 修复 iOS 更新和删除未设置筛选条件时可能被错误放行的问题;全表操作仍须显式传入
allowAll: true。 - 修复 iOS 使用 WAL 模式后,关闭数据库再恢复备份仍可能提示日志文件占用的问题;保留未关闭连接及文件占用保护。
- 修复 iOS 云打包时关闭数据库失败提示无法正常生成的问题;升级后无需修改调用代码。
- 本版本尚未发布。升级后无需修改调用代码或项目配置;iOS、Android 需要重新原生联编,或重新制作并安装对应平台自定义基座/正式包,不能仅更新 WGT;Web 重新编译即可。
平台兼容性
uni-app(5.07)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | - | - | - | - | - | - | - | - | - | - |
uni-app x(5.07)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | × | √ |
lizhao-sqlite-pro
介绍
lizhao-sqlite-pro 是面向 uni-app / uni-app x 的本地数据库插件。App 端使用各平台原生 SQLite 能力,业务代码可以同时使用参数化 SQL、结构化增删改查、Schema Builder、轻量 ORM、迁移、备份恢复和诊断功能。
功能特色
- 在 App 中保存离线订单、表单草稿、巡检记录、消息、文章和业务配置。
- 使用
?占位符绑定数据,减少手动拼接 SQL 带来的错误和注入风险。 - 可选 Promise 接口顺序完成读写,同模板批量写入默认整批事务。
- 按需查看操作耗时与慢操作摘要,默认关闭采集。
- 不想手写完整 SQL 时,使用对象配置完成查询、新增、更新和删除。
- 在应用升级时按版本执行数据库迁移,避免重复执行同一批变更。
- 创建并核对表、字段和索引,完成 Upsert、计数、聚合和分页。
- 备份、恢复或导出本地数据,并通过数据库健康检查和诊断信息排查问题。
- 配合
lizhao-choose-file把沙盒备份保存到系统文件位置,或把用户选择的备份复制回沙盒后恢复。 - 在 Web、微信小程序和支付宝小程序中保留统一入口,并按真实能力明确降级。
本插件管理的是当前应用沙盒内的本地数据,不提供云端同步、账号间自动合并或服务器数据库能力。数据库文件不提供整库加密;敏感字段应由业务在写入前加密,整库加密需要另行接入 SQLCipher 等方案并安全管理密钥。
适合哪些场景
- 离线订单、巡检、仓储、工单等需要在无网络环境下持续读写的数据。
- 表单草稿、文章、消息、本地统计和应用配置等需要可靠持久化的数据。
- 数据表需要随 App 版本升级,并要求迁移只执行一次的项目。
- 希望用结构化 CRUD、Schema Builder 或 ORM Lite 减少手写 SQL 的业务。
- 需要备份、恢复、换机归档,或与
lizhao-choose-file联动访问系统文件位置的场景。 - 同一套业务还要运行在 Web 或小程序,并接受明确能力降级的跨端项目。
先选择接入方式
| 你的需求 | 推荐接入方式 | 适合程度 |
|---|---|---|
| 第一次接入,只需要建表、写入和查询 | 参数化 SQL | 最容易理解,先看模块一。 |
| 不想拼接查询、更新和删除 SQL | 结构化 CRUD | 使用 selectRows / insertRow / updateRows / deleteRows。 |
| 需要声明表结构并做常用数据访问 | Schema Builder + ORM Lite | 使用 ensureSchema / upsertRow / countRows / aggregateRows / paginateRows。 |
| App 原生端一组操作必须全部成功或全部失败 | batch 或事务 |
普通批量写入优先使用 batch,复杂流程再手动控制事务。 |
| App 升级时新增表、字段或修正数据 | 数据库迁移 | 使用 runMigrations,每个版本只执行一次。 |
| 需要换机、归档或问题排查 | 备份、JSON 导出和诊断 | App 大数据量优先文件备份,跨端或小数据量可用 JSON。 |
| 用户要在系统文件管理器中导入或另存数据库备份 | 联动 lizhao-choose-file |
使用沙盒文件桥,不能把系统 URI 直接传给 SQLite。 |
| 只想先查看所有能力 | 内置演示组件 | 页面中直接使用 <lizhao-sqlite-pro />。 |
如果没有既有数据库封装,建议按“模块一 → 模块二 → 模块三”的顺序阅读。只有确实需要升级结构、文件备份或问题排查时,再继续后面的模块。
下载与导入
- 从 DCloud 插件市场将插件导入项目。
- 页面和业务代码只从插件根目录导入,不要直接引用
utssdk内部文件。 - App 端需要完成原生联编,并使用包含当前插件的自定义基座或正式安装包。
uni-app 导入
// 普通 uni-app 页面从插件根目录导入需要的 API。
import {
openDatabase,
executePrepared,
closeDatabase
} from '@/uni_modules/lizhao-sqlite-pro'
uni-app x 导入
// <script setup lang="uts"> 中同样只从插件根目录导入。
import {
openDatabase,
executePrepared,
closeDatabase
} from '@/uni_modules/lizhao-sqlite-pro'
UTS 插件通过 HBuilderX 编译后直接 import 使用,不通过 uni.xxx 或 uni.requireNativePlugin 调用。后续业务示例以普通 uni-app 写法为主;uni-app x 使用同名 API,强类型页面示例见文末“完整示例”。
示例位置
- uni-app 完整页面:
uni_modules/lizhao-sqlite-pro/example/uniapp/sqlitePro.vue - uni-app x 完整页面:
uni_modules/lizhao-sqlite-pro/example/uniappx/index.uvue - uni-app 内置组件:
uni_modules/lizhao-sqlite-pro/components/lizhao-sqlite-pro/lizhao-sqlite-pro.vue - uni-app x 内置组件:
uni_modules/lizhao-sqlite-pro/components/lizhao-sqlite-pro/lizhao-sqlite-pro.uvue
第一次接入建议先运行完整示例并完成“模块一”,确认打开、建表、写入、查询和关闭链路正常,再按业务需要继续后续模块。
从基础到进阶:按业务模块使用
除模块七的能力判断外,后续示例都假设数据库名称保持一致,并且相关操作只在 openDatabase 成功后执行。
模块一:打开数据库并完成第一次读写
适合第一次接入。下面示例会打开数据库、创建表、写入一条数据、查询结果,最后关闭连接。
import {
openDatabase,
executePrepared,
closeDatabase
} from '@/uni_modules/lizhao-sqlite-pro'
const databaseName = 'business'
// 查询结束后再关闭连接,避免异步操作尚未完成就提前关闭数据库。
function closeDemoDatabase() {
closeDatabase({
name: databaseName,
fail(err) {
console.error('关闭数据库失败', err)
}
})
}
function queryFirstUser() {
executePrepared({
name: databaseName,
sql: 'SELECT id, name, score FROM users WHERE id = ?',
params: [1],
query: true,
success(rows) {
console.log('查询结果', rows)
},
fail(err) {
console.error('查询失败', err)
},
complete() {
closeDemoDatabase()
}
})
}
function writeFirstUser() {
executePrepared({
name: databaseName,
sql: 'INSERT OR REPLACE INTO users (id, name, score) VALUES (?, ?, ?)',
params: [1, '小李', 95],
query: false,
success() {
queryFirstUser()
},
fail(err) {
console.error('写入失败', err)
closeDemoDatabase()
}
})
}
function createUserTable() {
executePrepared({
name: databaseName,
sql: 'CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT NOT NULL, score REAL DEFAULT 0)',
params: [],
query: false,
success() {
writeFirstUser()
},
fail(err) {
console.error('建表失败', err)
closeDemoDatabase()
}
})
}
openDatabase({
name: databaseName,
success(res) {
console.log('数据库已打开', res.path)
createUserTable()
},
fail(err) {
console.error('打开数据库失败', err)
}
})
executePrepared 中的 ? 会按 params 顺序绑定。写入值、查询条件和用户输入都建议使用参数绑定,不要直接拼进 SQL 字符串。query: true 表示成功回调返回行数组;建表、插入、更新和删除使用 query: false。
同一个业务流程应始终使用相同的 name。连接可以在页面或数据服务初始化时打开,在不再有待执行操作时关闭;不要在发起查询后立即调用 closeDatabase。Web 和小程序调用 closeDatabase 时会同时清空该名称下的内存数据,再次打开得到空库。
模块二:使用对象配置完成增删改查
适合希望减少 SQL 拼接的业务。以下方法仍会对数据值做参数绑定,表名和字段名则会经过标识符校验。
import {
insertRow,
selectRows,
updateRows,
deleteRows,
batchCrud
} from '@/uni_modules/lizhao-sqlite-pro'
const databaseName = 'business'
// 新增一行。
export function addUser() {
insertRow({
name: databaseName,
table: 'users',
values: [
{ column: 'name', value: '小王' },
{ column: 'score', value: 88 }
],
success(res) {
console.log('新增成功,行号', res.insertId)
},
fail(err) {
console.error('新增失败', err)
}
})
}
// 查询分数不低于 80 的用户。
export function loadHighScoreUsers() {
selectRows({
name: databaseName,
table: 'users',
columns: ['id', 'name', 'score'],
where: [{ column: 'score', op: '>=', value: 80 }],
orderBy: [{ column: 'score', direction: 'DESC' }],
limit: 20,
offset: 0,
success(rows) {
console.log('高分用户', rows)
},
fail(err) {
console.error('查询失败', err)
}
})
}
// 按主键更新,where 仍然使用参数绑定。
export function renameUser(userId, newName) {
updateRows({
name: databaseName,
table: 'users',
values: [{ column: 'name', value: newName }],
where: 'id = ?',
whereParams: [userId],
fail(err) {
console.error('更新失败', err)
}
})
}
// 按主键删除。
export function removeUser(userId) {
deleteRows({
name: databaseName,
table: 'users',
where: [{ column: 'id', op: '=', value: userId }],
fail(err) {
console.error('删除失败', err)
}
})
}
// 一次完成多项结构化操作,默认使用事务并在失败时回滚。
export function addAndQueryUser() {
batchCrud({
name: databaseName,
items: [
{
action: 'insert',
table: 'users',
values: [
{ column: 'name', value: '小周' },
{ column: 'score', value: 92 }
]
},
{
action: 'select',
table: 'users',
where: [{ column: 'score', op: '>=', value: 90 }],
orderBy: [{ column: 'id', direction: 'DESC' }]
}
],
transaction: true,
rollbackOnFail: true,
success(res) {
console.log('批量结构化操作结果', res.results)
},
fail(err) {
console.error('批量结构化操作失败', err)
}
})
}
对象条件支持 = / != / > / >= / < / <= / LIKE / IN / BETWEEN / IS NULL / IS NOT NULL。LIKE 的 % 由调用方放入值中;IN 和 BETWEEN 使用 values 数组。
updateRows 和 deleteRows 没有 where 时会被安全拦截。只有明确要操作整张表时才传 allowAll: true,并建议在业务层再次确认。
Web 支持结构化 CRUD,但普通 selectRows 暂不执行 groupBy / having;需要 Web 聚合时请使用模块三的 aggregateRows。微信和支付宝小程序不支持结构化 CRUD,应先查看模块七。
模块三:用 Schema Builder 和 ORM Lite 管理数据模型
适合需要统一建表、核对结构,以及完成 Upsert、计数、聚合和分页的项目。
import {
ensureSchema,
upsertRow,
countRows,
aggregateRows,
paginateRows
} from '@/uni_modules/lizhao-sqlite-pro'
const databaseName = 'business'
ensureSchema({
name: databaseName,
tables: [{
name: 'members',
columns: [
{ name: 'id', type: 'INTEGER', primaryKey: true, autoIncrement: true },
{ name: 'email', type: 'TEXT', notNull: true, unique: true },
{ name: 'score', type: 'REAL', defaultValue: 0 },
{ name: 'created_at', type: 'TEXT', defaultExpression: 'CURRENT_TIMESTAMP' }
],
indexes: [
{ name: 'idx_members_score', columns: ['score'], unique: false }
]
}],
success(schemaResult) {
console.log('结构已就绪', schemaResult)
upsertRow({
name: databaseName,
table: 'members',
values: [
{ column: 'email', value: 'demo@example.com' },
{ column: 'score', value: 96 }
],
conflictColumns: ['email'],
success(upsertResult) {
console.log('是否新增', upsertResult.inserted)
console.log('是否更新', upsertResult.updated)
},
fail(err) {
console.error('Upsert 失败', err)
}
})
},
fail(err) {
console.error('Schema 创建或核对失败', err)
}
})
countRows({
name: databaseName,
table: 'members',
where: [{ column: 'score', op: '>=', value: 60 }],
success(res) {
console.log('及格人数', res.count)
}
})
aggregateRows({
name: databaseName,
table: 'members',
aggregates: [
{ function: 'COUNT', column: '*', alias: 'member_count' },
{ function: 'AVG', column: 'score', alias: 'average_score' }
],
success(rows) {
console.log('统计结果', rows)
}
})
paginateRows({
name: databaseName,
table: 'members',
columns: ['id', 'email', 'score'],
orderBy: [{ column: 'id', direction: 'DESC' }],
page: 1,
pageSize: 20,
success(res) {
console.log('总数', res.total)
console.log('当前页', res.rows)
}
})
ensureSchema 只创建缺失的表和索引,并核对已有字段、主键、非空和索引声明。发现现有结构与声明冲突时会失败,不会自动删表、改列或重建业务数据。应用升级时需要新增字段或搬迁数据,请使用模块五的 runMigrations。
upsertRow 的 conflictColumns 必须对应主键或唯一约束,否则底层数据库会返回真实错误。聚合函数只允许 COUNT / SUM / AVG / MIN / MAX;分页页码从 1 开始,每页最多 500 条。
需要单独管理索引时,可使用 createIndex 和 dropIndex。索引名称、表名和字段名都会经过校验。
模块四:使用事务和批处理保证一组操作
适合 App 原生端的订单与明细、主记录与日志等必须一起成功的写入流程。普通批量 SQL 优先使用 batch,它默认开启事务并在任一条失败时回滚。
import { batch } from '@/uni_modules/lizhao-sqlite-pro'
batch({
name: 'business',
items: [
{
sql: 'INSERT INTO orders (order_no, amount) VALUES (?, ?)',
params: ['ORDER-1001', 299]
},
{
sql: 'INSERT INTO order_logs (order_no, action) VALUES (?, ?)',
params: ['ORDER-1001', 'created']
}
],
transaction: true,
rollbackOnFail: true,
success(res) {
console.log('全部执行成功', res.count)
},
fail(err) {
console.error('批处理失败,请通过 err.details 确认执行位置和回滚结果', err)
}
})
只有操作之间需要业务判断时,才手动控制 begin / commit / rollback:
import {
transaction,
executePrepared
} from '@/uni_modules/lizhao-sqlite-pro'
function rollbackOrder() {
transaction({
name: 'business',
operation: 'rollback',
fail(err) {
console.error('回滚失败', err)
}
})
}
function createOrderInTransaction() {
transaction({
name: 'business',
operation: 'begin',
success() {
executePrepared({
name: 'business',
sql: 'INSERT INTO orders (order_no, amount) VALUES (?, ?)',
params: ['ORDER-1002', 199],
success() {
transaction({
name: 'business',
operation: 'commit',
fail(err) {
console.error('提交失败', err)
rollbackOrder()
}
})
},
fail(err) {
console.error('写入失败', err)
rollbackOrder()
}
})
},
fail(err) {
console.error('开启事务失败', err)
}
})
}
开启手动事务后,每条失败路径都应明确回滚;不要在事务尚未提交或回滚时关闭数据库。batchCrud 也支持相同的 transaction 和 rollbackOnFail 配置。
已经开启手动事务时,批处理请传 transaction: false,由你在外层统一提交或回滚;默认批处理不会接管已有事务。批次 SQL 中不要夹带 BEGIN / COMMIT / ROLLBACK / SAVEPOINT 等事务命令。
如果允许保留失败前的成功项,可传 rollbackOnFail: false:批处理会停止后续条目,并尝试提交本次事务中已经成功的部分,但仍进入 fail。不要把失败前的执行数量直接当作最终保存数量,具体判断见后部“批处理失败详情”。
Web 和小程序支持当前内存会话的事务快照:回滚会恢复本次事务之前的表和数据,但不会把数据保存到磁盘。涉及订单、余额等必须原子落盘的数据,只应在 nativeSqlite: true 且 persistent: true 的 App 原生端使用本模块;其他平台应改用服务端事务或平台自己的持久化方案。
模块五:用迁移安全升级数据库结构
适合应用升级时新增表、索引、字段或修正已有数据。App 原生端会在迁移记录表中保存结果,每个正整数版本只执行一次。
import { runMigrations } from '@/uni_modules/lizhao-sqlite-pro'
runMigrations({
name: 'business',
migrations: [
{
version: 1,
name: '创建设置表',
sql: [
'CREATE TABLE IF NOT EXISTS settings (key TEXT PRIMARY KEY, value TEXT)'
]
},
{
version: 2,
name: '给用户表增加状态字段',
sql: [
"ALTER TABLE users ADD COLUMN status TEXT DEFAULT 'active'"
]
}
],
success(res) {
console.log('迁移前版本', res.fromVersion)
console.log('迁移后版本', res.toVersion)
console.log('本次执行版本', res.appliedVersions)
},
fail(err) {
console.error('迁移失败', err)
}
})
迁移数组应按版本递增维护。已经发布并在设备上执行过的迁移不要改写,应新增更高版本;否则不同安装时间的设备可能得到不同结构。App 原生端默认记录表名为 lizhao_sqlite_schema_migrations,一般无需修改。
插件会先校验整份迁移,再按版本从小到大执行高于当前最大版本的项。每个版本的 SQL 和版本记录一起提交;某个版本失败时会回滚该版本并停止后续迁移,之前已成功提交的版本保留。迁移前先结束手动事务,SQL 中不要自行开启、提交或回滚事务。
Web 和小程序会在同一次数据库打开期间记住迁移记录;重复调用时只执行高于已应用最大版本的项,不会重放旧迁移。记录按 tableName 隔离,关闭数据库或刷新页面后仍会丢失。降级端只适合演示和轻量内存数据,不应承担正式数据库升级。
迁移中的 SQL 是结构脚本,没有独立 params 字段。涉及业务输入的数据修正应先严格校验,或在迁移完成后通过参数化 API 执行。
模块六:备份、恢复、导出和导入数据
适合换机、故障备份、调试和小规模跨端数据搬迁。App 原生端可做数据库文件备份;JSON 导出导入在 App、Web 和小程序都可以按各自能力使用。
importDatabase不是增量合并:导入 JSON 时会重建导出内容涉及的表,降级端也会重建当前内存数据。执行前请先备份,并确认导入内容可以覆盖目标表。
import {
getDatabasePath,
backupDatabase,
restoreDatabase,
exportDatabase,
importDatabase
} from '@/uni_modules/lizhao-sqlite-pro'
const databaseName = 'business'
const backupPath = getDatabasePath(databaseName) + '.bak'
// App 原生端备份真实数据库文件。
export function createDatabaseBackup() {
backupDatabase({
name: databaseName,
path: backupPath,
success(res) {
console.log('备份文件', res.targetPath)
},
fail(err) {
console.error('备份失败', err)
}
})
}
// 从同一备份文件恢复。Android/iOS 请先完成操作并 closeDatabase,再调用此函数。
// Harmony 则保持数据库打开。恢复成功后按下方平台表继续操作。
export function restoreDatabaseBackup() {
restoreDatabase({
name: databaseName,
path: backupPath,
success(res) {
console.log('恢复成功', res.success)
},
fail(err) {
console.error('恢复失败', err)
}
})
}
// 导出稳定 JSON;可保存到业务文件,也可直接交给 importDatabase。
export function exportDatabaseJson() {
exportDatabase({
name: databaseName,
success(res) {
console.log('导出表数量', res.tableCount)
console.log('导出 JSON', res.data)
},
fail(err) {
console.error('导出失败', err)
}
})
}
export function importDatabaseJson(jsonText) {
importDatabase({
name: databaseName,
data: jsonText,
success(res) {
console.log('导入表数量', res.tableCount)
},
fail(err) {
console.error('导入失败', err)
}
})
}
backupDatabase / restoreDatabase 需要真实数据库文件,Web 和小程序会返回不支持。exportDatabase 返回包含 schema / tables / rows 的 lizhao-sqlite-pro-json 文本,可直接作为 importDatabase({ data }) 的输入。
| 平台 | 恢复时的连接处理 | JSON 文件参数 |
|---|---|---|
| Android | 恢复前必须关闭源库、目标库及同文件的所有别名连接;成功后重新调用 openDatabase。 |
exportDatabase.path 可写 JSON,importDatabase.path 可读 JSON。 |
| iOS | 恢复前必须关闭源库、目标库及同文件的所有别名连接;成功后重新调用 openDatabase。 |
exportDatabase.path 可写 JSON,写入失败会返回失败;importDatabase.path 可读 JSON。 |
| Harmony | 备份和恢复要求数据库保持打开。 | 导出读取返回的 data;importDatabase.path 会按数据库文件恢复,不是 JSON 文件入口。 |
| Web / 小程序 | 不支持数据库文件备份恢复。 | 导出读取返回的 data,导入必须传 data。 |
联动 lizhao-choose-file 访问系统文件位置
SQLite 原生备份与恢复只操作应用沙盒普通路径。Android 文件选择器返回的 content://、iOS 安全作用域 URL、Harmony picker URI 都是系统授权标识,不等于 SQLite 可直接打开的本地路径。
- 备份:先调用
backupDatabase生成沙盒备份,成功后把targetPath交给saveSandboxFile。 - 恢复:先调用
pickFileToSandbox,等待文件完整复制,再把返回的file.path交给restoreDatabase。
import {
backupDatabase,
restoreDatabase,
getDatabasePath
} from '@/uni_modules/lizhao-sqlite-pro'
import {
pickFileToSandbox,
saveSandboxFile
} from '@/uni_modules/lizhao-choose-file'
const databaseName = 'business'
const sandboxBackupPath = getDatabasePath(databaseName) + '.system-backup.db'
export function backupAndSaveToSystem() {
backupDatabase({
name: databaseName,
path: sandboxBackupPath,
success(backupResult) {
// 只有数据库备份成功后,才打开系统另存为界面。
saveSandboxFile({
path: backupResult.targetPath,
filename: databaseName + '-backup.db',
mimeType: 'application/vnd.sqlite3',
success(saveResult) {
console.log('已保存', saveResult.name, saveResult.size)
},
fail(err) {
console.error('系统另存为失败', err)
}
})
},
fail(err) {
console.error('数据库备份失败', err)
}
})
}
export function pickBackupAndRestore() {
pickFileToSandbox({
accept: '.db,.sqlite,.sqlite3,.bak',
directory: 'cache',
success(file) {
// file.path 已是应用沙盒普通路径,不要传原始系统 URI。
restoreDatabase({
name: databaseName,
path: file.path,
success() {
console.log('数据库恢复成功')
},
fail(err) {
console.error('数据库恢复失败', err)
}
})
},
fail(err) {
console.error('选择或复制备份失败', err)
}
})
}
Android/iOS 恢复前必须关闭目标数据库,恢复成功后重新 openDatabase;Harmony 则保持数据库打开后调用恢复。两个插件的 uni-app 与 uni-app x 示例页都提供“备份并另存为”和“选择备份并恢复”按钮,可直接查看完整连接处理。
saveSandboxFile.success.targetUri 只表示本次系统保存目标,不保证是 SQLite 可用或可长期访问的路径。后续要恢复该文件时仍应重新调用 pickFileToSandbox。文件桥只支持 Android、iOS、Harmony;Web 和小程序请使用 JSON 导出导入或平台自己的文件方案。
跨端 JSON 导入建议只传 data。path 在各 App 平台的处理方式不同,数据库文件恢复请统一使用 restoreDatabase,不要把 importDatabase({ path }) 当作跨端恢复接口。Android 和 iOS 不会替你关闭连接,尚未关闭时恢复会返回失败;成功后再次调用 openDatabase,使用自定义路径时仍传入原来的 path。
JSON 适合调试、迁移和小规模数据搬迁;数据量较大时,App 端优先使用文件备份。导出内容可能包含业务数据,保存、上传或提交给技术支持前应自行脱敏和加密。
模块七:按平台能力处理 Web 和小程序降级
适合同一套业务代码需要运行到多个平台的项目。先读取能力,再决定显示完整功能、使用基础 SQL,还是给出不支持提示。
import {
getCapabilities,
executePrepared,
selectRows
} from '@/uni_modules/lizhao-sqlite-pro'
const capabilities = getCapabilities()
console.log('当前平台', capabilities.platform)
console.log('是否真实 SQLite', capabilities.nativeSqlite)
console.log('数据是否持久化', capabilities.persistent)
if (capabilities.structuredCrud) {
selectRows({
name: 'business',
table: 'users',
success(rows) {
console.log('结构化查询结果', rows)
},
fail(err) {
console.error('结构化查询失败', err)
}
})
} else if (capabilities.parameterized) {
executePrepared({
name: 'business',
sql: 'SELECT * FROM users',
params: [],
query: true,
success(rows) {
console.log('基础 SQL 查询结果', rows)
},
fail(err) {
console.error('基础 SQL 查询失败', err)
}
})
} else {
console.log(capabilities.reason || '当前平台不支持本地数据库能力')
}
能力字段:
| 字段 | 含义 |
|---|---|
supported |
当前适配器是否提供可调用的数据库能力。 |
platform |
当前运行平台。 |
adapter |
当前实际使用的原生或降级适配器。 |
nativeSqlite |
是否为 App 原生数据库文件,而不是内存降级。 |
persistent |
页面或进程结束后是否保留数据。 |
parameterized |
是否支持参数化 SQL。 |
transaction |
是否提供事务调用入口;降级端不代表具有原生原子回滚能力。 |
migration |
是否提供迁移调用入口;降级端不持久保存迁移版本。 |
backupRestore |
是否支持真实数据库文件备份恢复。 |
importExport |
是否支持数据导入导出入口。 |
jsonExportImport |
是否支持稳定 JSON 导出导入。 |
healthCheck |
是否支持当前适配器的健康检查。 |
pragmaConfig |
是否支持真实 SQLite PRAGMA 配置。 |
schemaInspection |
是否支持结构检查。 |
structuredCrud |
是否支持结构化增删改查。 |
schemaBuilder |
是否支持 ensureSchema。 |
indexManagement |
是否支持创建和删除索引。 |
upsert |
是否支持 Upsert。 |
aggregation |
是否支持计数与聚合。 |
pagination |
是否支持一致性分页。 |
diagnostics |
是否支持诊断快照。 |
requiresCustomBase |
当前平台是否需要包含插件原生代码的自定义基座或正式包。 |
reason |
当前平台的降级原因或补充说明。 |
Web 页面刷新或调用 closeDatabase 后,内存数据会丢失,不要把它当成浏览器持久化数据库。微信和支付宝小程序关闭数据库时同样会清空当前内存数据。小程序的结构化 CRUD、Schema Builder、Upsert、聚合和分页会明确进入失败回调;这类业务应使用基础 SQL 子集,或改用平台自己的持久化能力。
Web 基础 SQL 支持建表、DROP TABLE [IF EXISTS]、插入,以及带基础 WHERE 条件的查询和删除;查询支持按字段 ORDER BY 排序和非负整数 LIMIT / OFFSET 分页。字符串条件支持 ? 参数、数字、单引号文本、NULL 判断和 AND / OR;文本中的单引号写成两个单引号,例如 'O''Brien'。函数、子查询等超出此子集的表达式会返回错误,不能按完整 SQLite 语法使用。
模块八:上线前检查数据库并收集诊断
适合接入完成后的自检,以及排查“表不存在、数据为空、文件过大、平台能力不一致”等问题。
import {
configureDatabase,
inspectDatabase,
runHealthCheck,
getCapabilities,
getDiagnostics,
clearDiagnostics
} from '@/uni_modules/lizhao-sqlite-pro'
const databaseName = 'business'
const capabilities = getCapabilities()
// 只有能力矩阵确认支持时才配置真实 PRAGMA。
if (capabilities.pragmaConfig) {
configureDatabase({
name: databaseName,
foreignKeys: true,
journalMode: 'WAL',
busyTimeoutMs: 3000,
synchronous: 'NORMAL',
fail(err) {
console.error('数据库配置失败', err)
}
})
}
inspectDatabase({
name: databaseName,
includeSampleRows: false,
sampleLimit: 3,
success(res) {
console.log('表数量', res.tableCount)
console.log('结构摘要', res.tables)
},
fail(err) {
console.error('结构检查失败', err)
}
})
runHealthCheck({
name: databaseName,
fullCheck: false,
includeTableStats: true,
success(res) {
console.log('数据库是否健康', res.ok)
console.log('提示信息', res.warnings)
},
fail(err) {
console.error('健康检查失败', err)
}
})
const diagnostics = getDiagnostics({ includeLogs: true })
console.log('运行平台', diagnostics.platform)
console.log('已打开数据库', diagnostics.openedDatabases)
console.log('最近诊断', diagnostics.logs)
// 问题排查结束后可清空旧日志。
clearDiagnostics()
getDiagnostics() 直接同步返回结果,也支持可选的 success / complete 回调,回调收到同一次调用的诊断快照。iOS 回调会异步派发,不要依赖回调在函数返回前执行;只读取返回值的现有写法仍可使用。clearDiagnostics() 同步清空当前插件日志。
includeSampleRows: true 会把少量样例数据放入结构检查结果。诊断或工单场景若不需要真实内容,应保持 false;复制日志、导出 JSON 或结构样例前都应检查是否包含敏感信息。
fullCheck: false 使用较轻量的检查,适合日常检查;完整一致性检查开销更高,建议在维护页面或用户主动触发时使用。
模块九:用 Promise 顺序完成读写
需要依次打开、建表、写入再查询时,可以使用可选的异步接口,让执行顺序直接体现在代码里。原有回调接口继续可用;两种方式返回相同业务结果,异步失败以原有的 SqliteFail 拒绝。
下面的流程使用独立演示库,App、Web 和基础 SQL 小程序降级端均可调用:
import { openDatabaseAsync, executePreparedAsync, closeDatabaseAsync } from '@/uni_modules/lizhao-sqlite-pro'
async function saveAndRead() {
const name = 'async_demo'
await openDatabaseAsync({ name })
try {
await executePreparedAsync({ name, sql: 'CREATE TABLE IF NOT EXISTS notes (id INTEGER, title TEXT)' })
await executePreparedAsync({ name, sql: 'INSERT INTO notes (id, title) VALUES (?, ?)', params: [1, '离线笔记'] })
const rows = await executePreparedAsync({ name, sql: 'SELECT id, title FROM notes', query: true })
console.log(rows)
} finally {
await closeDatabaseAsync({ name })
}
}
结构化操作在 App 和 Web 中使用 selectRowsAsync、insertRowAsync、updateRowsAsync、deleteRowsAsync;参数沿用对应回调接口,但不传 success / fail / complete。更新、删除仍保留无条件操作保护,明确全表操作时才设置 allowAll: true。小程序不支持的结构化能力仍返回 9040013。
import { openDatabaseAsync, executePreparedAsync, updateRowsAsync, selectRowsAsync, closeDatabaseAsync } from '@/uni_modules/lizhao-sqlite-pro'
async function renameAndRead() {
const name = 'crud_async_demo'
await openDatabaseAsync({ name })
try {
await executePreparedAsync({ name, sql: 'CREATE TABLE IF NOT EXISTS notes (id INTEGER, title TEXT)' })
await executePreparedAsync({ name, sql: 'INSERT INTO notes (id, title) VALUES (?, ?)', params: [1, '待修改'] })
await updateRowsAsync({ name, table: 'notes', values: [{ column: 'title', value: '新标题' }], where: 'id = ?', whereParams: [1] })
return await selectRowsAsync({ name, table: 'notes', where: 'id = ?', whereParams: [1] })
} finally {
await closeDatabaseAsync({ name })
}
}
Promise 只改变接入方式,不表示自动在后台线程执行。同一个库的读写按 await 顺序调用;不要并发执行依赖同一事务的操作。batchAsync 沿用 batch 的事务、rollbackOnFail 和失败详情规则。
模块十:用一条模板导入多条数据
导入离线订单、同步记录或初始化数据时,使用 executeMany / executeManyAsync 提交一条写入 SQL 和多组参数。Android、iOS 在一次调用中复用原生语句,减少逐条准备和回调;其他端按支持范围执行。
下面先准备独立演示库,再导入三条笔记。Harmony 的插入请使用 batchAsync,其他平台可运行此基础模板:
import { openDatabaseAsync, executePreparedAsync, executeManyAsync, closeDatabaseAsync } from '@/uni_modules/lizhao-sqlite-pro'
async function importNotes() {
const name = 'many_demo'
await openDatabaseAsync({ name })
try {
await executePreparedAsync({ name, sql: 'CREATE TABLE IF NOT EXISTS notes (id INTEGER, title TEXT)' })
const result = await executeManyAsync({
name,
sql: 'INSERT INTO notes (id, title) VALUES (?, ?)',
parameterSets: [[101, '第一条'], [102, '第二条'], [103, '第三条']]
})
console.log('执行条目', result.count, '影响行数', result.affectedRows)
} finally {
await closeDatabaseAsync({ name })
}
}
默认以事务执行整批:一条失败就回滚本批次。已有手动事务时,传 transaction: false 并自行提交或回滚;该模式不会接管调用方事务,若没有外部事务,失败前的成功条目可能已经保存。参数在任何写入前整批校验并复制,后面的参数组不合法时不会留下成功前缀。
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| name | string | 是 | 已打开的数据库名称 | 无 | 无 |
| sql | string | 是 | 单条 INSERT、UPDATE 或 DELETE 模板 | 无 | 仅匿名 ? 占位符 |
| parameterSets | Array |
是 | 非空二维数组,每组参数数量与 ? 相同 | 无 | null、布尔、字符串、有限数值;整数须在安全范围内 |
| transaction | boolean | 否 | 是否由本次调用建立并完成整批事务 | true | false |
| resultMode | string | 否 | summary 只返回汇总;items 同时返回逐条摘要 | summary | items |
不接受多语句、查询、建表、RETURNING、编号或命名占位符、OR ROLLBACK,以及对象、数组、undefined、NaN、Infinity 等参数值。需要混合 SQL、查询结果或逐条不同模板时继续使用 batch / batchAsync。
summary 模式的 results 为空数组;items 模式每条只包含执行摘要,不返回 SQL 文本,insertId 固定为 -1,表示本接口不提供生成主键。count 是成功执行的参数组数量,affectedRows 是实际受影响行数;执行成功但没有匹配记录的语句也计入 count。
| 平台 | 固定模板批量能力 | 使用建议 |
|---|---|---|
| Android、iOS | INSERT、UPDATE、DELETE;一次调用复用语句 | 导入时优先汇总模式 |
| Harmony | API 12 起支持 UPDATE、DELETE;不支持 INSERT 批量计数 | 插入继续使用 batchAsync,示例会自动采用兼容批处理 |
| Web | 基础 INSERT INTO 表(列) VALUES (?, ...)、UPDATE 表 SET 列 = ?、基础 DELETE | 不支持原生约束、复杂表达式、INSERT SELECT 或冲突策略;刷新不保留数据 |
| 微信、支付宝小程序 | 基础 INSERT VALUES 匿名参数、基础 DELETE | UPDATE 和结构化操作返回 9040013;只保证当前内存会话 |
失败沿用 SqliteFail;在 catch 或 fail 中读取 errCode、errMsg 和 details,无需解析错误文本。details 提供 failedIndex(从 0 起,无法对应条目时为 -1)、completedCount、rolledBack、phase。completedCount 记录失败前执行数量,不代表已经提交;rolledBack 为 null 时不能认定已回滚。阶段包括 validate、begin、execute、finalize、commit、rollback。
回调方式在数据库已打开、notes 表已创建时使用:
import { executeMany } from '@/uni_modules/lizhao-sqlite-pro'
executeMany({
name: 'demo', sql: 'INSERT INTO notes (id, title) VALUES (?, ?)',
parameterSets: [[201, '待同步']], resultMode: 'items',
success: (result) => console.log(result.count, result.results),
fail: (error) => console.log(error.errCode, error.details),
complete: () => console.log('本次导入已结束')
})
模块十一:查看操作耗时和慢操作
排查导入或查询响应慢时,显式开启摘要采集,再运行需要观察的操作。默认不采集;只记录新 Promise 接口和 executeMany 的操作名称、时间、成功状态、条数和错误码,不记录库名、SQL、参数、结果行。
import { openDatabaseAsync, executePreparedAsync, closeDatabaseAsync, configureDiagnostics, getDiagnostics, clearDiagnostics } from '@/uni_modules/lizhao-sqlite-pro'
async function inspectQueryTime() {
const name = 'diagnostic_demo'
await openDatabaseAsync({ name })
try {
await executePreparedAsync({ name, sql: 'CREATE TABLE IF NOT EXISTS notes (id INTEGER, title TEXT)' })
configureDiagnostics({ enabled: true, slowThresholdMs: 50, maxEntries: 30 })
await executePreparedAsync({ name, sql: 'SELECT id, title FROM notes', query: true })
const snapshot = getDiagnostics({ includeLogs: false })
console.log(snapshot.operations)
} finally {
configureDiagnostics({ enabled: false })
clearDiagnostics()
await closeDatabaseAsync({ name })
}
}
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| enabled | boolean | 是 | 开启或关闭摘要采集 | false | true |
| slowThresholdMs | number | 否 | 大于等于该耗时标为慢操作,必须是有限非负数 | 100 | 0 表示全部标记 |
| maxEntries | number | 否 | 最多保留的操作摘要条数,必须是 1–500 整数 | 100 | 1–500 |
configureDiagnostics 返回 boolean;配置不合法返回 false,并保留原配置。关闭采集后仍可读取已有摘要,clearDiagnostics 同时清空原日志和操作摘要。耗时包含 API 内部执行与等候,排除使用者回调时间;不是 SQLite 执行计划或独立引擎耗时。executeManyAsync 只记录一次 executeMany。
常用 API 与配置
API 用途总览
| API | 所属模块 | 用途 | 平台说明 |
|---|---|---|---|
openDatabase |
连接 | 打开或创建数据库。 | 全平台;降级平台打开内存数据库。 |
isOpenDatabase |
连接 | 判断指定数据库是否已打开。 | 同步返回 boolean,同时触发状态回调。 |
closeDatabase |
连接 | 关闭指定数据库连接。 | App 关闭连接;Web/小程序还会清空同名内存数据。 |
transaction |
事务 | 开始、提交或回滚事务。 | App 使用原生事务;Web/小程序只保护当前内存会话,不保证持久化。 |
executeSql |
原始 SQL | 执行增删改、建表或 SQL 数组。 | Web/小程序只支持其基础 SQL 子集。 |
selectSql |
原始 SQL | 执行查询并返回行数组。 | Web/小程序只支持其基础 SQL 子集。 |
getDatabasePath |
连接 | 获取数据库路径。 | 降级平台返回逻辑路径,不代表真实文件。 |
executePrepared |
参数化 SQL | 执行带 ? 占位符的查询或写入。 |
推荐用于所有动态数据。 |
batch |
批处理 | 连续执行多条参数化 SQL。 | 默认使用事务并在失败时回滚;Web/小程序只回滚当前内存数据。 |
selectRows |
结构化 CRUD | 使用对象配置查询。 | App/Web 支持,小程序不支持。 |
insertRow |
结构化 CRUD | 使用字段值数组新增一行。 | App/Web 支持,小程序不支持。 |
updateRows |
结构化 CRUD | 按条件更新行。 | App/Web 支持;默认禁止无条件全表更新。 |
deleteRows |
结构化 CRUD | 按条件删除行。 | App/Web 支持;默认禁止无条件全表删除。 |
batchCrud |
结构化 CRUD | 批量执行结构化增删改查。 | App/Web 支持,小程序不支持。 |
ensureSchema |
Schema | 创建并核对表和索引。 | App/Web 支持,小程序不支持。 |
createIndex |
Schema | 创建安全索引。 | App/Web 支持,小程序不支持。 |
dropIndex |
Schema | 删除安全索引。 | App/Web 支持,小程序不支持。 |
upsertRow |
ORM Lite | 按冲突字段新增或更新。 | App/Web 支持,小程序不支持。 |
countRows |
ORM Lite | 统计满足条件的行数。 | App/Web 支持,小程序不支持。 |
aggregateRows |
ORM Lite | 执行白名单聚合。 | App/Web 支持,小程序不支持。 |
paginateRows |
ORM Lite | 在一致读取中返回总数和当前页。 | App/Web 支持,小程序不支持。 |
runMigrations |
迁移 | 按正整数版本执行迁移。 | App 持久记录版本;Web/小程序仅执行内存迁移。 |
backupDatabase |
文件 | 备份真实数据库文件。 | 仅 App 原生数据库。 |
restoreDatabase |
文件 | 从备份文件恢复数据库。 | 仅 App 原生数据库。 |
exportDatabase |
文件 | 导出稳定 JSON。 | 全平台;内容来自当前平台的数据实现。 |
importDatabase |
文件 | 导入 JSON;跨端推荐传 data。 |
path 的 App 平台语义不同,文件恢复统一使用 restoreDatabase。 |
configureDatabase |
维护 | 配置外键、日志模式、忙碌等待和同步级别。 | App 支持;降级平台不伪造 PRAGMA 生效。 |
inspectDatabase |
维护 | 查看表、列、行数和可选样例行。 | 全平台按能力执行。 |
runHealthCheck |
维护 | 执行完整性检查和可选表统计。 | 降级平台结果会注明不是原生检查。 |
getCapabilities |
能力判断 | 同步返回当前平台能力矩阵。 | 全平台。 |
getDiagnostics |
诊断 | 同步返回平台、适配器、连接和日志快照。 | 全平台。 |
clearDiagnostics |
诊断 | 清空插件内部诊断日志。 | 全平台。 |
异步接入与批量诊断
| 常用方法 | 适用业务 | 使用结果 |
|---|---|---|
openDatabaseAsync |
顺序打开数据库 | Promise |
closeDatabaseAsync |
顺序关闭数据库 | Promise |
executePreparedAsync |
顺序执行参数化读写 | Promise<查询行或执行摘要> |
selectRowsAsync |
顺序读取结构化查询行 | Promise<行数组> |
insertRowAsync |
顺序新增单行 | Promise<执行摘要> |
updateRowsAsync |
顺序更新筛选行 | Promise<执行摘要> |
deleteRowsAsync |
顺序删除筛选行 | Promise<执行摘要> |
batchAsync |
顺序执行不同 SQL 的批次 | Promise<批次结果> |
executeMany |
同模板多组写入 | 汇总或逐条执行摘要 |
executeManyAsync |
异步接入同模板写入 | Promise<批量结果> |
configureDiagnostics |
开启或关闭操作摘要 | 配置是否生效 |
通用回调
大部分异步 API 都支持以下回调:
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
success |
function | 否 | 当前操作真实成功后触发,参数类型由 API 决定。 | 无 | 无 |
fail |
function | 否 | 参数、平台、SQL、Schema、文件或运行环境出错时触发。 | 无 | 无 |
complete |
function | 否 | 成功或失败后都会触发;成功时传 success 结果,失败时传 SqliteFail。 |
无 | 无 |
success 和 fail 只会走其中一个,complete 用于收尾。不要只监听 complete 判断成功;应在 success 中更新成功状态,在 fail 中展示错误。
getCapabilities()、getDiagnostics()、getDatabasePath() 和 clearDiagnostics() 以同步返回或同步执行为主。isOpenDatabase() 同步返回 boolean,并会通过传入的回调返回状态详情。
数据库连接参数
适用于 openDatabase / isOpenDatabase / closeDatabase:
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
name |
string | 是 | 数据库名称,也是连接的唯一标识。 | 无 | 非空字符串 |
path |
string | 否 | 自定义数据库路径;Android 支持绝对路径和应用沙盒路径,其他平台按能力处理。 | 应用沙盒路径 | 平台可访问路径 |
success |
function | 否 | 返回 name / path / opened。 |
无 | 无 |
fail |
function | 否 | 返回统一 SqliteFail。 |
无 | 无 |
complete |
function | 否 | 操作结束后触发。 | 无 | 无 |
getDatabasePath(name) 直接返回路径字符串。降级平台的路径只用于保持接口一致,不代表存在可复制的 SQLite 文件。
原始 SQL、参数化 SQL 与事务参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
name |
string | 是 | 已打开的数据库名称。 | 无 | 非空字符串 |
executeSql.sql |
string / Array<string> | 是 | 要执行的 SQL;数组会按顺序执行多条语句。 | 无 | 平台支持的 SQL |
selectSql.sql |
string / Array<string> | 是 | 查询 SQL;传数组时只执行第一条查询。 | 无 | 平台支持的查询 SQL |
operation |
string | transaction 必填 |
事务动作。 | 无 | begin / commit / rollback |
params |
Array<any> | 否 | executePrepared 的绑定参数,顺序对应 ?。 |
[] |
可序列化数据库值 |
query |
boolean | 否 | executePrepared 是否按查询返回行数组。 |
false |
true / false |
items |
Array<BatchSqlItem> | batch 必填 |
每项包含 sql / params / query。 |
无 | 至少一项 |
transaction |
boolean | 否 | 是否为本批次新建事务;已有手动事务时传 false 并自行收尾。 |
true |
true / false |
rollbackOnFail |
boolean | 否 | 自建事务中途失败时,true 回滚,false 尝试提交已成功部分;两者仍报告失败。 |
true |
true / false |
App 端多条 SQL 不建议用分号拼成一个字符串;请使用 SQL 数组、batch 或显式事务。动态值优先使用 executePrepared,表名和字段名不能用 ? 绑定。
Android 参数绑定保留 null、数字和字符串的区别,布尔值按 1 / 0 保存;例如 null 不会被改成空字符串。WITH 开头的写入也按写入返回摘要,查询返回行数组。每个批次或迁移数组元素只放一条 SQL;一个完整的触发器定义算一条语句。
结构化 CRUD 参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
name |
string | 是 | 已打开的数据库名称。 | 无 | 非空字符串 |
table |
string | 是 | 目标表名。 | 无 | 合法 SQLite 标识符 |
columns |
Array<string> | 否 | 查询字段。 | * |
合法字段名 |
values |
Array<any> | 新增/更新必填 | 字段值数组,每项为 { column, value }。 |
无 | 至少一项 |
where |
string / Array<any> | 否 | SQL 条件片段或对象条件数组。 | 无条件 | 见下表 |
whereParams |
Array<any> | 否 | 字符串 where 中 ? 的绑定值。 |
[] |
可序列化数据库值 |
groupBy |
string / Array<string> | 否 | 分组字段;Web 普通结构化查询暂不支持。 | 无 | 合法字段名 |
having |
string | 否 | 聚合后条件;Web 普通结构化查询暂不支持。 | 无 | SQL 条件片段 |
havingParams |
Array<any> | 否 | having 中 ? 的绑定值。 |
[] |
可序列化数据库值 |
orderBy |
string / Array<any> | 否 | SQL 排序片段或 { column, direction } 数组。 |
无 | ASC / DESC |
limit |
number | 否 | 最大返回条数。 | 无限制 | 大于或等于 0 |
offset |
number | 否 | 跳过条数。 | 0 |
大于或等于 0 |
allowAll |
boolean | 更新/删除可选 | 无条件时是否允许操作整表。 | false |
true / false |
batchCrud.items |
Array<BatchCrudItem> | 是 | 结构化操作数组。 | 无 | 至少一项 |
batchCrud.transaction |
boolean | 否 | 批量结构化操作是否使用事务。 | true |
true / false |
batchCrud.rollbackOnFail |
boolean | 否 | 任一项失败时是否按事务配置回滚。 | true |
true / false |
对象式条件项:
| 字段 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
column |
string | 是 | 条件字段。 | 无 | 合法字段名 |
op |
string | 否 | 比较操作符。 | = |
= / != / > / >= / < / <= / LIKE / IN / BETWEEN / IS NULL / IS NOT NULL |
value |
any | 单值操作符需要 | 单个绑定值。 | 无 | 可序列化数据库值 |
values |
Array<any> | IN / BETWEEN 需要 |
多个绑定值。 | 无 | BETWEEN 必须两个值 |
connector |
string | 否 | 与上一条件的连接方式。 | AND |
AND / OR |
对象排序项写作 { column, direction },其中 column 必填,direction 默认 ASC,可选 ASC / DESC。
结构化 values / where / orderBy 使用上表的固定字段数组,不支持任意对象动态键。例如写入姓名应传 values: [{ column: 'name', value: '小明' }],不要传 values: { name: '小明' };这样可以保持各 App 平台的调用方式一致。
batchCrud.items[] 额外包含必填的 action,可选值为 select / insert / update / delete;并可按动作使用 columns / values / where / whereParams / groupBy / having / havingParams / orderBy / limit / offset / allowAll。
Schema Builder 与 ORM Lite 参数
ensureSchema 的核心字段:
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
name |
string | 是 | 已打开的数据库名称。 | 无 | 非空字符串 |
tables |
Array<any> | 是 | 表声明数组。 | 无 | 至少一张表 |
tables[].name |
string | 是 | 表名。 | 无 | 合法标识符 |
tables[].columns |
Array<any> | 是 | 字段声明数组。 | 无 | 至少一个字段 |
tables[].primaryKey |
Array<string> | 否 | 表级复合主键字段。 | 无 | 已声明字段 |
tables[].indexes |
Array<any> | 否 | 索引声明数组。 | [] |
合法索引配置 |
columns[].name |
string | 是 | 字段名。 | 无 | 合法标识符 |
columns[].type |
string | 是 | SQLite 字段类型。 | 无 | INTEGER / REAL / TEXT / BLOB / NUMERIC |
columns[].primaryKey |
boolean | 否 | 是否为字段级主键。 | false |
true / false |
columns[].autoIncrement |
boolean | 否 | 是否为自增整数主键。 | false |
true / false |
columns[].notNull |
boolean | 否 | 是否禁止空值。 | false |
true / false |
columns[].unique |
boolean | 否 | 是否添加唯一约束。 | false |
true / false |
columns[].defaultValue |
string / number / boolean | 否 | 安全字面量默认值。 | 无 | 基础值 |
columns[].defaultExpression |
string | 否 | 固定安全默认表达式。 | 无 | CURRENT_TIMESTAMP / CURRENT_DATE / CURRENT_TIME |
索引和 ORM Lite 特有字段:
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
createIndex.table |
string | 是 | 索引所属表。 | 无 | 合法表名 |
createIndex.index |
string | 是 | 索引名。 | 无 | 合法索引名 |
createIndex.columns |
Array<string> | 是 | 索引字段。 | 无 | 至少一个字段 |
createIndex.unique |
boolean | 否 | 是否创建唯一索引。 | false |
true / false |
createIndex.ifNotExists |
boolean | 否 | 已存在时是否跳过。 | false |
true / false |
dropIndex.index |
string | 是 | 要删除的索引名。 | 无 | 合法索引名 |
dropIndex.ifExists |
boolean | 否 | 不存在时是否跳过。 | false |
true / false |
upsertRow.values |
Array<any> | 是 | 写入字段值数组。 | 无 | 至少一项 |
upsertRow.conflictColumns |
Array<string> | 是 | 判断冲突的主键或唯一字段。 | 无 | 至少一个字段 |
upsertRow.updateColumns |
Array<string> | 否 | 冲突后更新的字段。 | 非冲突写入字段 | 必须存在于 values |
upsertRow.doNothing |
boolean | 否 | 冲突时是否保持原行。 | false |
true / false |
aggregateRows.aggregates |
Array<any> | 是 | { function, column, alias } 聚合数组。 |
无 | COUNT / SUM / AVG / MIN / MAX |
countRows.where / whereParams |
string 或条件数组 / Array<any> | 否 | 计数条件与绑定值。 | 无条件 / [] |
与结构化条件相同 |
aggregateRows.where / whereParams |
string 或条件数组 / Array<any> | 否 | 聚合前的筛选条件与绑定值。 | 无条件 / [] |
与结构化条件相同 |
aggregateRows.groupBy |
Array<string> | 否 | 分组字段。 | 无 | 合法字段名 |
aggregateRows.orderBy |
string / Array<any> | 否 | 聚合结果排序。 | 无 | SQL 片段或对象排序数组 |
aggregateRows.limit / offset |
number | 否 | 限制结果条数和跳过条数。 | 无限制 / 0 |
大于或等于 0 |
paginateRows.page |
number | 是 | 页码,从 1 开始。 |
无 | 大于或等于 1 |
paginateRows.pageSize |
number | 是 | 每页数量。 | 无 | 1-500 |
paginateRows.columns |
Array<string> | 否 | 当前页返回字段。 | * |
合法字段名 |
paginateRows.where / whereParams |
string 或条件数组 / Array<any> | 否 | 分页筛选条件与绑定值。 | 无条件 / [] |
与结构化条件相同 |
paginateRows.orderBy |
string / Array<any> | 否 | 当前页排序。 | 无 | SQL 片段或对象排序数组 |
上述 where / whereParams / orderBy 的写法与结构化 CRUD 使用同一规则;countRows 只有筛选条件,不包含排序和分页参数。
迁移、文件与维护参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
runMigrations.migrations |
Array<MigrationItem> | 是 | 迁移数组。 | 无 | 按正整数版本递增 |
migrations[].version |
number | 是 | 目标版本号。 | 无 | 大于 0 的整数 |
migrations[].name |
string | 否 | 版本说明。 | 空字符串 | 任意说明文本 |
migrations[].sql |
Array<string> | 是 | 当前版本要执行的 SQL。 | 无 | 至少一条 |
runMigrations.tableName |
string | 否 | 迁移记录表名;降级端按此名称隔离当前内存会话的版本记录。 | lizhao_sqlite_schema_migrations |
字母或下划线开头,仅含字母、数字、下划线 |
backupDatabase.path |
string | 是 | 备份目标路径。 | 无 | App 可访问路径 |
restoreDatabase.path |
string | 是 | 备份源路径。 | 无 | App 可访问路径 |
exportDatabase.path |
string | 否 | JSON 导出目标路径;Android/iOS 可写文件,Harmony/Web/小程序以返回的 data 为准。 |
仅通过 data 返回 |
平台可访问路径 |
importDatabase.data |
string | 二选一 | 要导入的 lizhao-sqlite-pro-json 文本。 |
无 | 合法导出文本 |
importDatabase.path |
string | 二选一 | 平台相关文件入口:Android/iOS 可读取 JSON 文本文件,Harmony 按数据库文件恢复,Web/小程序不支持。跨端优先传 data。 |
无 | 平台可访问路径 |
configureDatabase.foreignKeys |
boolean | 否 | 是否启用外键约束。 | 保持当前值 | true / false |
configureDatabase.journalMode |
string | 否 | 日志模式。 | 保持当前值 | WAL / DELETE / TRUNCATE / PERSIST / MEMORY / OFF |
configureDatabase.busyTimeoutMs |
number | 否 | 忙碌等待时间,单位毫秒。 | 保持当前值 | 大于或等于 0 |
configureDatabase.synchronous |
string | 否 | 同步级别。 | 保持当前值 | NORMAL / FULL / OFF / EXTRA |
inspectDatabase.includeSampleRows |
boolean | 否 | 是否包含样例行。 | false |
true / false |
inspectDatabase.sampleLimit |
number | 否 | 每张表最多返回的样例行数。 | 3 |
大于或等于 0 |
runHealthCheck.fullCheck |
boolean | 否 | 是否执行完整一致性检查。 | false |
true / false |
runHealthCheck.includeTableStats |
boolean | 否 | 是否统计各表行数。 | true |
true / false |
getDiagnostics.includeLogs |
boolean | 否 | 是否在同步结果中包含最近日志。 | true |
true / false |
支持平台
| 平台 | 数据库能力 | 数据持久化 | 说明 |
|---|---|---|---|
| App Android | 原生 SQLite | 支持 | 使用系统 android.database.sqlite.SQLiteDatabase,支持全部公开 API。 |
| App iOS | 原生 SQLite | 支持 | 使用系统 SQLite3,支持全部公开 API。 |
| App Harmony | 原生关系型数据库 | 支持 | 使用系统 relationalStore / rdbStore,支持全部公开 API。 |
| Web/H5 | 内存数据库降级 | 不保证 | 支持参数化 SQL、结构化 CRUD、Schema Builder、ORM Lite、内存迁移和 JSON 导入导出;页面刷新或调用 closeDatabase 后数据不会保留。 |
| 微信小程序 | 基础内存 SQL 子集 | 不保证 | 支持基础 SQL、顺序批处理、内存迁移、JSON 导入导出和诊断;结构化 CRUD 与 ORM Lite 会明确返回不支持。 |
| 支付宝小程序(仅 uni-app) | 基础内存 SQL 子集 | 不保证 | 能力边界与微信小程序相同,适合轻量演示和统一接口适配。 |
App 端使用真实数据库文件。Web 使用内存降级,小程序使用更小的基础 SQL 子集。对明确不支持的能力,降级端会进入 fail / complete,不伪造成功。降级端事务仅保证当前内存会话的提交和回滚,不提供持久化;迁移记录也不会跨关闭或刷新保留。configureDatabase 的兼容结果不代表真实 SQLite PRAGMA 已生效。跨端项目应先调用 getCapabilities(),不要只根据插件市场的平台标记推断能力。
主要返回值
查询类 API 直接在 success 中返回行数组;其他常用结果如下:
| 返回类型或 API | 主要字段 | 说明 |
|---|---|---|
openDatabase / closeDatabase |
name / path / opened |
当前连接名称、路径和打开状态。 |
isOpenDatabase |
同步 boolean;回调含 name / path / opened |
同步值用于快速判断,回调提供完整状态。 |
transaction / executeSql / executePrepared(query: false) / insertRow / updateRows / deleteRows |
name / affectedRows / insertId / statementCount / lastSql |
事务动作、写入或结构操作摘要。 |
executePrepared(query: true) |
Array<UTSJSONObject> |
参数化查询的行数组。 |
selectSql / selectRows |
Array<UTSJSONObject> |
查询行数组,没有匹配数据时为空数组。 |
batch / batchCrud |
name / count / results |
条目数量和每项结果。 |
ensureSchema |
createdTables / existingTables / createdIndexes / existingIndexes / checkedColumns |
本次创建与核对摘要。 |
createIndex / dropIndex |
table / index / created / dropped |
索引操作结果。 |
upsertRow |
inserted / updated / affectedRows / insertId |
本次是新增、更新还是保持原行。 |
countRows |
name / count |
满足条件的行数。 |
aggregateRows |
Array<UTSJSONObject> |
每一行使用调用方提供的聚合别名。 |
paginateRows |
page / pageSize / total / pageCount / hasPrevious / hasNext / rows |
总数、页数和当前页数据。 |
runMigrations |
fromVersion / toVersion / appliedVersions |
迁移前后版本和本次执行列表。 |
backupDatabase / restoreDatabase |
sourcePath / targetPath / success |
文件来源、目标和操作状态。 |
exportDatabase / importDatabase |
path / data / tableCount |
JSON 文本、路径和表数量。 |
configureDatabase |
applied / values |
实际应用项和结果摘要。 |
inspectDatabase |
path / tableCount / tables |
表结构、行数和可选样例。 |
runHealthCheck |
ok / integrity / databaseSize / tableCount / tableStats / warnings |
健康状态、大小、统计和提示。 |
getCapabilities |
能力布尔字段与 reason |
当前平台的真实支持矩阵。 |
getDiagnostics |
plugin / version / platform / adapter / openedDatabases / logs |
当前运行与最近诊断快照。 |
失败回调统一收到 SqliteFail,常用字段为 errSubject / errCode / errMsg / details。Web 和小程序中的普通错误对象不继承 UniError,但仍保留这些字段,业务代码可以统一读取 err.errCode 和 err.errMsg。
Android 的 executeSql / executePrepared 写入摘要中,affectedRows 是该语句实际影响的行数,结构操作为 0。executeSql 传数组时,行数和行号描述最后一条语句,statementCount 为执行条数。只有能确认本次新增行时才返回 insertId,否则为 -1;更新、无 rowid 表、UPSERT 更新或行号未变化时,不应把它当成新的业务主键。
批处理失败详情
batch / batchCrud 失败时,可读取 err.details 定位进度;不改变原来的 errCode / errMsg 处理方式。
| 字段 | 类型 | 说明 |
|---|---|---|
failedIndex |
number | 失败条目的下标,从 0 开始;无法关联具体条目时为 -1。 |
completedCount |
number | 失败前执行成功的条目数,不等于最终保存数。 |
rolledBack |
boolean / null | true 已确认回滚;false 未执行回滚;null 收尾失败或结果无法确认。 |
phase |
string | validate 参数检查、begin 开始事务、execute 执行条目、commit 提交、rollback 回滚。 |
当 rolledBack 为 null 时,不要直接重试整批写入;先检查连接状态和实际数据,避免重复保存。transaction: false 时,外层事务是否提交或回滚仍由调用方决定。
错误码
| 错误码 | 含义 | 建议处理 |
|---|---|---|
9040001 |
当前平台或功能不支持完整 SQLite。 | 读取 getCapabilities(),改用支持的基础能力或显示降级提示。 |
9040002 |
参数不合法。 | 检查数据库名、SQL、字段、数组和数值范围。 |
9040003 |
运行时上下文不可用。 | 确认 App 使用包含插件的原生联编包,并在应用运行环境中调用。 |
9040004 |
数据库未打开。 | 等待 openDatabase.success 后再执行后续操作,并保持 name 一致。 |
9040005 |
数据库已经打开。 | 复用现有连接,或先确认目标平台的连接状态。 |
9040006 |
打开数据库失败。 | 检查名称、路径、沙盒访问范围和底层错误信息。 |
9040007 |
关闭数据库失败。 | 确认没有未结束事务或仍在执行的 SQL。 |
9040008 |
SQL 执行失败。 | 检查 SQL 语法、表字段和约束;动态值改用参数绑定。 |
9040009 |
查询执行失败。 | 检查表名、字段名、条件和绑定参数数量。 |
9040010 |
事务执行失败。 | 检查 begin/commit/rollback 顺序,并保证失败路径回滚。 |
9040011 |
迁移执行失败。 | 检查版本顺序和迁移 SQL,不要改写已经执行过的旧版本。 |
9040012 |
文件操作失败。 | 检查路径和剩余空间;Android/iOS 还需确认目标不是已打开的数据库、恢复前连接已关闭,备份时没有正在执行的事务。 |
9040013 |
降级存储不支持该 SQL 或结构化能力。 | 使用能力矩阵中已支持的 SQL 子集,或切换到 App 原生端。 |
9040014 |
Schema 声明不合法。 | 检查表名、字段类型、主键、默认值和索引声明。 |
9040015 |
现有 Schema 与声明冲突。 | 使用显式迁移调整已有结构,不要依赖 ensureSchema 自动改列。 |
9040016 |
索引操作失败。 | 检查表、字段、索引名称及是否已存在。 |
9040017 |
Upsert 执行失败。 | 确认冲突字段具有主键或唯一约束,并存在于写入数据中。 |
9040018 |
计数或聚合执行失败。 | 检查聚合函数、字段、别名和结构化条件。 |
9040019 |
分页执行失败。 | 确认页码从 1 开始、每页数量在 1-500 范围内。 |
完整示例
两套完整页面使用相同的模块顺序和操作分组:功能介绍 → 离线数据流程 → 快速验证 → 辅助操作与文件备份恢复 → 全量自检 → 当前状态与日志 → 完整能力面板。对应按钮、配色和尺寸保持一致。
完整页面和内置组件提供“批量导入与异步查询”面板:显式准备独立示例库、导入 500 条、查询前 5 条,并在支持结构化操作的平台体验异步增改删。演示行在成功后清理,面板展示结果数量与耗时。诊断由开关启用,普通打开不写入数据;原有快速上手、ORM、App 系统文件备份恢复和全量自检继续保留。
插件内置两套完整示例和同名 easycom 组件:
- uni-app 页面:
example/uniapp/sqlitePro.vue - uni-app x 页面:
example/uniappx/index.uvue - uni-app 组件:
components/lizhao-sqlite-pro/lizhao-sqlite-pro.vue - uni-app x 组件:
components/lizhao-sqlite-pro/lizhao-sqlite-pro.uvue
直接使用内置组件
<template>
<!-- easycom 会按项目类型选择 .vue 或 .uvue 组件。 -->
<lizhao-sqlite-pro />
</template>
组件包含打开、写入、查询、事务、结构化 CRUD、Schema、ORM Lite、迁移、文件操作和诊断按钮,适合先验证项目是否正确接入。正式业务仍建议在自己的数据服务中按需导入 API。
uni-app x 强类型页面示例
<template>
<view>
<button @click="openAndQuery">打开并查询数据库</button>
</view>
</template>
<script setup lang="uts">
import {
openDatabase,
executePrepared,
closeDatabase
} from '@/uni_modules/lizhao-sqlite-pro'
const databaseName: string = 'business'
// UTS 页面中先定义函数,再交给按钮和回调使用。
function closeCurrentDatabase(): void {
closeDatabase({
name: databaseName,
fail(err) {
console.log('关闭失败', err)
}
})
}
function queryUsers(): void {
executePrepared({
name: databaseName,
sql: 'SELECT * FROM users ORDER BY id DESC',
params: [] as Array<any>,
query: true,
success(rows: any) {
console.log('uni-app x 查询结果', rows)
},
fail(err) {
console.log('uni-app x 查询失败', err)
},
complete() {
closeCurrentDatabase()
}
})
}
function openAndQuery(): void {
openDatabase({
name: databaseName,
success() {
queryUsers()
},
fail(err) {
console.log('uni-app x 打开失败', err)
}
})
}
</script>
一键全量自检
内置 uni-app / uni-app x 组件和完整示例提供“一键全量自检”,会从插件根入口串行调用真实公开 API,并生成“通过 / 失败 / 跳过 / 耗时”报告。
- 手动检查:进入完整示例,点击“一键全量自检”,结束后可复制安全报告。
- 自动检查:仅在明确的测试场景给完整示例页追加
autoFullCheck=1;日志会输出稳定的 START、ITEM、DONE 和 FAILED 标记。 - 普通打开示例不会自动执行,也不会自动创建或写入自检数据库。
skipped表示当前平台能力矩阵明确不支持,不等于通过。- App 结果必须来自包含当前插件代码的匹配安装包;旧基座中的历史结果不能证明新源码已运行。
注意事项
- 所有数据库操作都应在
openDatabase.success后执行,并在最后一个异步操作完成后再关闭连接。 - 动态数据使用
executePrepared或结构化 API 绑定,不要直接拼接用户输入。 updateRows / deleteRows默认禁止无条件整表操作;allowAll: true只用于明确且经过确认的场景。ensureSchema只创建和核对,不自动改列或删除数据;发布后的结构升级使用新的迁移版本。- App 端多条 SQL 使用数组、
batch或事务,不要依赖分号拼接多条命令。 - Web 和小程序属于内存降级,不可当作完整、持久化的 SQLite 文件数据库;调用
closeDatabase会清空同名数据和迁移记录,事务快照只在当前内存会话内有效。 - Web 普通结构化查询暂不支持
groupBy / having;Web 聚合使用aggregateRows。 - 小程序不支持结构化 CRUD 与 ORM Lite;受限能力会触发
fail / complete,不会伪造成功。 - 文件备份恢复只适用于具有真实数据库文件的 App 平台;Android/iOS 恢复前须关闭源库、目标库及其所有别名连接,恢复成功后重新打开。跨端搬迁可使用 JSON 导出导入。
- Android/iOS 备份路径不能与原库、原库的伴随文件或其他已打开数据库相同;备份前先提交或回滚当前事务。遇到数据库忙或并发写入提示时,暂停写入后重试,不会继续复制不完整的数据。
- Android/iOS 恢复请使用完整且已关闭的 SQLite 备份文件,操作期间不能由其他线程或进程读写源文件和目标文件。源备份存在 WAL、SHM 或 journal 时始终拒绝;目标库存在 WAL、SHM 或活跃 journal 时也会拒绝。Android 正常关闭后,PERSIST 模式可能仅把 journal 头部清零,文件后部仍保留旧页内容;插件会在原子替换前识别并清理这种失效 journal,无需手动删除。临时文件写入或校验失败不会覆盖原目标。
- Android/iOS 在当前进程内记住已打开过的自定义路径,便于关闭后恢复;应用重启后请先按原
path打开并关闭数据库,再执行恢复,不能仅凭数据库名称找回自定义路径。 - JSON 导入会重建涉及的表,执行前必须确认允许覆盖并先做好备份;跨端调用优先传
data。 - 导出 JSON、样例行和诊断日志可能包含业务信息,对外提供前应检查、脱敏并安全传输。
- 当前数据库文件没有内置整库加密。敏感字段或整库加密方案需要由项目另行设计,并安全保存密钥。
- App Android、iOS 和 Harmony 使用原生能力时,需要制作并安装包含插件的自定义基座或正式包;只更新 WGT 不会替换已编译的 UTS 原生代码。
常见问题
调用后提示数据库未打开
按以下顺序检查:
- 后续操作是否写在
openDatabase.success之后。 openDatabase和查询、写入使用的name是否完全一致。- 是否在异步 SQL 完成前调用了
closeDatabase。 - 页面切换或业务服务销毁时是否提前关闭了共享连接。
查询成功但返回空数组
空数组表示查询执行成功,但没有符合条件的数据。请确认目标表确实有数据、事务已经提交、字段名正确,并检查 where 与 whereParams 数量是否对应。调试时可以先去掉条件,再逐项恢复。
为什么参数写进 SQL 后容易报错
姓名、搜索词、时间和其他动态值不要直接拼接。请使用:
executePrepared({
name: 'business',
sql: 'SELECT * FROM users WHERE name = ?',
params: ['小李'],
query: true,
fail(err) {
console.error('查询失败', err)
}
})
? 只能绑定数据值,不能替代表名、字段名、排序方向或 SQL 关键字。这些结构项可改用结构化 API,并使用固定白名单。
Web 刷新后数据为什么消失
Web 使用内存数据库降级,persistent 为 false,页面刷新、运行上下文重建或调用 closeDatabase 后数据都不会保留。这一实现用于跨端演示、轻量缓存和接口连通;需要浏览器持久化时应使用 IndexedDB、服务端存储或其他适合 Web 的方案。
小程序为什么提示结构化 CRUD 或 ORM Lite 不支持
微信和支付宝小程序当前只实现基础内存 SQL 子集,不支持 selectRows / insertRow / updateRows / deleteRows / batchCrud,也不支持 Schema Builder、Upsert、聚合和分页。请先判断 getCapabilities(),使用 executePrepared / selectSql 的受支持子集,或采用小程序自己的持久化方案。
ensureSchema 为什么报告结构冲突
ensureSchema 不会自动修改已有字段,以免意外破坏数据。当字段类型、主键、非空或索引声明与现有数据库不一致时,它会返回 9040015。应编写更高版本的 runMigrations 显式完成结构变更。
更新或删除整表为什么被拒绝
这是默认安全保护。请优先提供 where;只有业务确实需要操作整表时才传 allowAll: true。建议在界面和业务服务层同时增加确认,避免误删数据。
备份恢复和 JSON 导出导入怎么选择
- App 原生端、数据量大、同平台恢复:优先
backupDatabase / restoreDatabase。 - 跨端、小规模搬迁、调试或人工查看:使用
exportDatabase / importDatabase。 - Web 或小程序没有真实 SQLite 文件,只能使用 JSON 能力或平台自己的存储。
JSON 导入会重建导出内容涉及的表,不是按主键增量合并。导入前先备份目标数据,并优先把导出的文本通过 data 传入;不要同时传 data 和 path。
为什么不能把系统选择器返回的 URI 直接传给恢复接口
content://、iOS 安全作用域 URL 和 Harmony picker URI 依赖系统临时授权,既不是跨平台普通路径,也可能在回调结束后失效。请使用 lizhao-choose-file.pickFileToSandbox 先复制到当前应用沙盒,再把返回的 file.path 交给 restoreDatabase。直接截取、拼接或把 URI 转成看似本地的字符串都不可靠。
Android 正常关闭后为什么还会看到 .db-journal
Android SQLite 可能使用 PERSIST 模式保留回滚日志:提交后 journal 头部清零,文件后部仍可保留上一次事务的旧页内容。插件会在恢复目标库前识别并清理这种失效 journal;如果检测到 WAL、SHM、有效回滚日志,或源备份本身带有伴随文件,仍会返回占用错误。不要手动删除无法确认状态的数据库日志文件。
数据库文件是否已经加密
没有。插件市场的源码保护、应用沙盒访问控制和数据库文件加密是三件不同的事。当前插件未内置 SQLCipher、PRAGMA key 或等价整库密钥配置;如果攻击者在越权设备环境中取得数据库及 WAL 文件,未额外加密的数据可能被读取。
敏感数据可在写入前做字段级加密。需要整库加密时,应另行实现加密数据库并把密钥保存在 Android Keystore、iOS Keychain 或 Harmony HUKS 等安全设施中,不要把固定密钥写在代码或配置文件里。
App 接入后如何使用当前插件能力
App 请安装包含当前插件原生代码的自定义基座或正式包,单独更新页面资源不能增加原生能力;Web 重新编译页面资源后即可使用。
作者系列 UTS 插件
以下为已在 DCloud 插件市场上架的作者系列 UTS 插件,可按业务场景组合使用。未列出的插件表示当前未确认公开市场页,后续上架后再补充。
| 插件 | 能力方向 | 插件市场 |
|---|---|---|
lizhao-nfc-pro |
NFC 标签读写、NDEF、IsoDep 与诊断 | 查看插件 |
lizhao-float-window |
悬浮窗、画中画、权限与诊断 | 查看插件 |
lizhao-device-id |
设备标识、隐私策略与诊断 | 查看插件 |
lizhao-scan-pro |
原生扫码、连续扫码、相册识别 | 查看插件 |
lizhao-choose-file |
原生文件选择、上传、进度与取消 | 查看插件 |
lizhao-bg-audio |
背景音频播放、队列、倍速与事件 | 查看插件 |
lizhao-smart-tts |
系统 TTS、云端合成、听书方案 | 查看插件 |
lizhao-share-plus |
系统分享、远程文件下载后分享 | 查看插件 |
lizhao-sqlite-pro |
原生 SQLite、迁移、备份与诊断 | 查看插件 |
lizhao-icon-pro |
SVG 图标组件、多主题与缓存 | 查看插件 |
lizhao-cast-screen |
DLNA 投屏、AirPlay 路由入口 | 查看插件 |
lizhao-call-kit |
电话、短信、通讯录原生能力 | 查看插件 |
lizhao-app-keepalive |
应用保活、唤醒、自愈与报告 | 查看插件 |
lizhao-doc-corrector |
文档扫描、矫正、增强与识别 | 查看插件 |
lizhao-emu-detect |
模拟器环境检测、风险评分与证据 | 查看插件 |
lizhao-gallery-pro |
相册媒体分页、筛选、缩略图与导出 | 查看插件 |
lizhao-video-thumb |
视频封面、批量取帧与 Base64 返回 | 查看插件 |
lizhao-ble |
BLE 扫描、连接、读写、通知与自动重连 | 查看插件 |
lizhao-sse-pro |
SSE、Line、JSONL 与 Raw 流式请求 | 查看插件 |
lizhao-pdf-pro |
PDF 阅读、签批、真实写回与页面处理 | 查看插件 |
lizhao-serial-port |
路径串口、USB 串口、多会话收发与诊断 | 查看插件 |
lizhao-wechat-kit |
微信登录、分享、支付、小程序与客服 | 查看插件 |
lizhao-video-editor |
视频裁剪、压缩、取帧与 FFmpeg/FFprobe | 查看插件 |
lizhao-vpn-pro |
企业 VPN、IKEv2、安全接入与脱敏诊断 | 查看插件 |
lizhao-camera-pro |
原生相机、拍照录像、水印与媒体保存 | 查看插件 |
lizhao-tcp-pro |
TCP 客户端、服务端、多连接与诊断 | 查看插件 |
lizhao-notify-pro |
本地通知、点击动作、进度与定时提醒 | 查看插件 |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 6486
赞赏 5
下载 12711101
赞赏 1957
赞赏
京公网安备:11010802035340号