更新记录

1.0.0(2026-01-19)

首次发布


平台兼容性

uni-app x(4.65)

Chrome Safari Android Android插件版本 iOS 鸿蒙 微信小程序
× × 5.0 1.0.0 × × ×

SQLite 插件说明文档

一、插件概述

1.1 插件简介

该SQLite插件是基于UniApp X + UTS开发的Android端本地数据库操作插件,封装了SQLite数据库的核心操作(连接管理、CRUD、事务、多表关联查询等),提供了面向对象的模型化开发方式,简化了原生SQLite的使用复杂度,同时保证了类型安全和操作规范性。

1.2 核心特性

  • 开箱即用:封装数据库连接、表管理、数据操作等核心能力,无需编写原生SQL即可完成基础操作;
  • 模型化开发:支持通过定义模型自动创建表结构,挂载CRUD方法,降低开发成本;
  • 丰富的查询能力:支持基础单表查询、多表关联查询(一对一/一对多/多对多)、复杂条件过滤;
  • 事务支持:提供事务开启、提交、回滚能力,保证批量操作的原子性;
  • 类型安全:基于UTS强类型定义,所有入参、出参均有明确类型约束,减少运行时错误;
  • 防SQL注入:参数化查询设计,避免直接拼接SQL带来的注入风险。

1.3 适用场景

  • UniApp X 开发的Android端本地数据存储场景;
  • 需要结构化存储、复杂查询的本地业务(如本地缓存、离线数据、小型业务数据);
  • 偏好模型化开发、不想编写原生SQL的开发场景;
  • 需要多表关联查询、事务保障的本地数据操作场景。

二、快速开始

2.1 安装与引入

将插件文件放置在 uni_modules/se-sqlite 目录下,在业务代码中引入核心类:

import { SQLiteHelper } from '@/uni_modules/se-sqlite'

2.2 基础使用流程

步骤1:初始化数据库连接

// 初始化SQLiteHelper实例,参数为数据库名称(自动创建.db后缀)
const sqlite = new SQLiteHelper('demo');
// 检查连接状态
console.log(sqlite.isOpen()); // 输出:true

步骤2:定义数据模型

import { ModelDefType } from '@/uni_modules/se-sqlite'

// 定义用户表模型
export const userModelDef : ModelDefType = {
  tableName: 'user', // 表名(仅字母/数字,以字母开头)
  columns: [
    { name: "id", type: "INTEGER", primaryKey: true, autoIncrement: true },
    { name: "name", type: "TEXT" },
    { name: "age", type: "INTEGER", default: 0 },
    { name: "createAt", type: "DATE", default: "NOW" }
  ]
};

步骤3:挂载模型并使用

// 挂载模型(自动创建表)
const UserModel = sqlite.defineModel(userModelDef);

// 基础查询
const result = UserModel.query({
  where: { age: { $gt: 18 } } // 查询年龄大于18的用户
});
console.log(result);

三、核心API详解

3.1 SQLiteHelper 核心类

SQLiteHelper 是插件的核心入口类,负责数据库连接管理、基础操作执行、模型定义等,所有数据库操作均基于此类实例。

3.1.1 构造函数

方法签名 说明 入参规范 注意事项
constructor(name: string) 初始化数据库实例,自动创建/连接数据库 name:数据库名称(仅字母/数字,以字母开头,不能为空) 1. 名称会自动拼接.db后缀;
2. 名称不合法会抛出异常;
3. 内部自动获取应用上下文,无需手动传入

3.1.2 连接管理

方法名 方法签名 作用 应用场景 返回值 注意事项
isOpen isOpen(): boolean 检查数据库连接是否开启 执行操作前校验连接状态 boolean:true=已连接,false=未连接
open open(): ExecuteResult 开启/重建数据库连接 连接异常时重新连接 ExecuteResult:包含success、msg、data 已连接时返回“无需开启”提示
close close(): ExecuteResult 关闭数据库连接 页面销毁/应用退出时释放资源 ExecuteResult:包含success、msg、data 未连接时返回“无需关闭”提示

3.1.3 数据库信息查询

方法名 方法签名 作用 应用场景 返回值 注意事项
getVersion getVersion(): string 获取SQLite版本号 调试/兼容性校验 string:版本号(如3.39.4) 未连接时抛出异常
isTableExists isTableExists(tableName: string): ExecuteResult 检查表是否存在 表操作前校验 ExecuteResult:data包含exists(是否存在)、count(表数量) 表名不能为空
getAllTableNames getAllTableNames(): ExecuteResult 查询所有用户自定义表名 数据库结构校验 ExecuteResult:data包含tableNames(表名数组)、count(表数量) 排除sqlite_开头的系统表
getTableInfo getTableInfo(tableName: string): ExecuteResult 查询表的完整结构 调试/表结构校验 ExecuteResult:data包含字段信息、创建SQL 表不存在时返回失败结果

3.1.4 基础数据操作

方法名 方法签名 作用 应用场景 返回值 注意事项
insert insert(table: string, values: UTSJSONObject): ExecuteResult 插入单条数据 单条数据新增 ExecuteResult:data包含rowId(新增行ID) 1. 表名/数据不能为空;
2. 自动转换数据类型(布尔值转0/1、时间转字符串)
insertBatch insertBatch(tableName: string, values: UTSJSONObject[]): ExecuteResult 批量插入数据 多条数据批量新增 ExecuteResult:data包含successCount(成功条数)、insertIds(行ID数组) 1. 事务保障原子性;
2. 空数据会跳过并记录失败信息
delete delete(tableName: string, whereClause: string, whereArgs: string[]): ExecuteResult 删除数据 条件删除数据 ExecuteResult:data包含deleteCount(删除行数) 1. whereClause不能为空;
2. 不支持直接删除表(删除表用runSql)
update update(tableName: string, values: UTSJSONObject, whereClause: string, whereArgs: string[]): ExecuteResult 更新数据 条件更新数据 ExecuteResult:data包含updateCount(更新行数) 1. 数据/条件不能为空;
2. 自动转换数据类型
find find(tableName: string, columns?: string[], whereClause?: string, whereArgs?: string[], orderBy?: string, limit?: string): ExecuteResult 通用查询 单表基础查询 ExecuteResult:data包含count(总条数)、row(数据数组) 支持分页、排序、条件过滤
findComplex findComplex(sql: string, args?: string[], countSql?: string, countArgs?: string[]): ExecuteResult 复杂查询 多表JOIN/子查询 ExecuteResult:data包含count(总条数)、row(数据数组) 支持任意复杂SQL,自动解析多表字段为嵌套对象
runSql runSql(sqlStr: string): ExecuteResult 执行自定义SQL 建表/删表/复杂SQL操作 ExecuteResult:执行状态+消息 1. SQL不能为空;
2. 需自行保证SQL合法性

3.1.5 事务操作

方法名 方法签名 作用 应用场景 返回值 注意事项
beginTransaction beginTransaction(): ExecuteResult 开启事务 批量操作前开启 ExecuteResult:执行状态+消息 未连接时返回失败
submitTransaction submitTransaction(): ExecuteResult 标记事务成功 批量操作成功后调用 ExecuteResult:执行状态+消息 提交前必须调用,否则事务回滚
endTransaction endTransaction(): ExecuteResult 结束事务 批量操作最后调用 ExecuteResult:执行状态+消息 无论成功失败都需调用,成功则提交,失败则回滚

3.1.6 模型定义

方法名 方法签名 作用 应用场景 返回值 注意事项
defineModel defineModel(model: ModelDefType): Model 定义模型并挂载CRUD方法 模型化开发 Model:挂载了CRUD方法的模型实例 1. 自动创建表;
2. 表创建失败会抛出异常

3.2 Model 模型类

Model 类是基于模型定义生成的实例类,封装了针对具体表的CRUD方法,无需关注底层SQL,直接通过对象方法操作数据。

3.2.1 核心方法

方法名 方法签名 作用 应用场景 入参规范 注意事项
insert insert(data: UTSJSONObject): ExecuteResult 插入单条数据 单条数据新增 data:符合模型字段的对象 自动过滤非法字段,处理特殊类型(布尔值/时间)
insertBatch insertBatch(dataList: UTSJSONObject[]): ExecuteResult 批量插入数据 多条数据新增 dataList:符合模型字段的对象数组 事务保障原子性
update update(data: UTSJSONObject, options: UpdateOptions): ExecuteResult 更新数据 条件更新 data:更新数据;options:包含where条件(必填) where条件不能为空
delete delete(options: DeleteOptions): ExecuteResult 删除数据 条件删除 options:包含where条件(必填) where条件不能为空
query query(options: QueryOptions): ExecuteResult 基础查询 单表查询 options:包含columns/where/limit/offset/order 自动转换where条件为SQL
queryComplex queryComplex(options: ComplexQueryOptions): ExecuteResult 复杂查询 多表关联查询 options:包含columns/where/include/limit/offset/order 支持一对一/一对多/多对多关联

3.3 工具方法(transform.uts)

工具方法主要用于内部转换,部分对外暴露,核心作用是将开发者友好的参数转换为SQLite可执行的SQL语句。

方法名 作用 应用场景 注意事项
transformWhere 将JSON格式的where条件转换为SQL WHERE子句 所有查询/更新/删除操作的条件转换 支持$eq/$gt/$in等操作符,自动防SQL注入
buildCreateTableSql 根据模型定义构建建表SQL defineModel时自动调用 校验表名/字段名合法性,支持外键/唯一约束
buildComplexQuerySql 构建多表关联查询的SQL queryComplex时自动调用 支持JOIN、分页、排序,自动处理表别名
transformToNestedResult 将扁平化查询结果转换为嵌套结构 多表关联查询结果格式化 自动去重,适配多对多关联的嵌套展示

四、类型定义规范

4.1 核心类型说明

所有类型定义均在 interface.uts 中,核心类型如下:

类型名 作用 核心字段
ExecuteResult 所有操作的返回结果类型 success(是否成功)、msg(消息)、data(数据)
ModelDefType 模型定义类型 tableName(表名)、columns(字段列表)、foreignKeys(外键)、uniqueKeys(复合唯一约束)
tableColumnType 字段定义类型 name(字段名)、type(类型)、primaryKey(主键)、autoIncrement(自增)等
QueryOptions 基础查询参数类型 columns(查询字段)、where(条件)、limit(条数)、offset(偏移量)、order(排序)
ComplexQueryOptions 复杂查询参数类型 继承QueryOptions,新增include(关联配置)
IncludeOption 关联查询配置类型 model(关联模型)、as(别名)、foreignKey(外键)、through(多对多中间表)

4.2 字段类型映射

插件支持的字段类型与SQLite原生类型的映射关系:

插件类型 SQLite原生类型 说明
INTEGER INTEGER 整数类型,支持自增/主键
TEXT TEXT 字符串类型,DATE类型也存储为TEXT
REAL REAL 浮点数类型
BLOB BLOB 二进制数据类型
BOOLEAN INTEGER 存储为0(false)/1(true)
DATE TEXT 存储为ISO格式字符串,默认值NOW对应当前时间

五、最佳实践

5.1 目录结构规范

uni_modules/
└── se-sqlite/          # 插件核心目录
utils/
└── db/                     # 数据库管理目录
    ├── models/             # 模型定义目录
    │   ├── user.uts        # 用户表模型
    │   ├── house.uts       # 房产表模型
    │   └── relUserHouse.uts # 多对多关联表模型
    └── index.uts           # 数据库初始化与模型导出
pages/
└── index/
    └── index.uvue          # 业务页面使用模型

5.2 模型定义规范

  1. 表名/字段名仅包含字母/数字,且以字母开头;
  2. 主键建议命名为id,类型为INTEGER且开启autoIncrement;
  3. 时间字段建议命名为createAt/updateAt,类型为DATE,默认值设为NOW;
  4. 外键字段建议命名为“关联表名+Id”(如ownerId关联user表的id);
  5. 多对多关联表建议命名为rel+主表名+关联表名(如relUserHouse)。

5.3 多表关联查询示例

一对一/一对多关联

// 查询用户及关联的房产
const result = UserModel.queryComplex({
  where: { age: { $gt: 15 } },
  include: [
    {
      model: HouseModel.modelDef, // 关联房产模型
      as: 'houses', // 结果嵌套别名
      columns: ['label'], // 关联表查询字段
      foreignKey: 'ownerId', // 房产表的外键
      targetKey: 'id', // 用户表的主键
      required: false // LEFT JOIN(true为INNER JOIN)
    }
  ]
});

多对多关联(通过中间表)

// 查询用户及通过中间表关联的房产
const result = UserModel.queryComplex({
  columns: ['name', 'age'],
  include: [{
    model: HouseModel.modelDef,
    as: 'houses',
    columns: ['label'],
    through: {
      table: 'relUserHouse', // 中间表名
      mainKey: 'id', // 用户表主键
      mainForeignKey: 'ownerId', // 中间表关联用户的外键
      otherKey: 'id', // 房产表主键
      otherForeignKey: 'houseId', // 中间表关联房产的外键
      columns: ['ownerId', 'houseId'], // 中间表返回字段
      as: 'Rel' // 中间表嵌套别名
    }
  }]
});

5.4 事务使用示例

// 批量插入数据,事务保障
try {
  sqlite.beginTransaction(); // 开启事务
  const result1 = UserModel.insert({ name: '张三', age: 20 });
  const result2 = HouseModel.insert({ label: '北京某小区', ownerId: result1.data.rowId });
  sqlite.submitTransaction(); // 标记事务成功
  sqlite.endTransaction(); // 结束事务(提交)
  console.log('批量插入成功');
} catch (e) {
  sqlite.endTransaction(); // 结束事务(回滚)
  console.error('批量插入失败,事务回滚:', e);
}

六、注意事项

6.1 通用注意事项

  1. 数据库名称/表名/字段名仅支持字母/数字,且必须以字母开头,否则会抛出异常;
  2. 所有操作均需保证数据库连接已开启(isOpen返回true),否则会返回失败结果;
  3. 批量操作建议使用事务,避免部分成功部分失败;
  4. 查询结果的游标会自动关闭,无需手动处理,但复杂查询需注意结果集大小,避免内存溢出;
  5. 外键约束需在模型定义中配置,SQLite默认开启外键支持,插件已适配。

6.2 性能注意事项

  1. 大量数据查询建议使用分页(limit/offset),避免一次性查询全部数据;
  2. 多表关联查询尽量指定columns,只查询需要的字段,减少数据传输;
  3. 频繁的插入/更新操作建议使用批量方法(insertBatch),减少数据库IO;
  4. 复杂查询建议先通过getTableInfo确认表结构,避免字段名错误。

6.3 兼容性注意事项

  1. 该插件仅支持Android端,基于UniApp X的UTS开发,不支持iOS/小程序;
  2. 依赖UniApp X的UTS环境,需确保项目已配置正确的UTS编译环境;
  3. SQLite版本由设备系统决定,插件已兼容主流版本(3.x)。

七、常见问题

7.1 连接相关

  • Q:初始化时抛出“获取应用上下文失败”? A:检查UniApp X项目配置,确保UTS环境初始化完成,应用上下文正常获取。
  • Q:isOpen返回false? A:可能是数据库名称不合法,或应用权限不足,检查名称规范并确保应用有存储权限。

7.2 模型定义相关

  • Q:defineModel抛出“表名不符合命名规则”? A:表名包含特殊字符或数字开头,修改为仅字母/数字且以字母开头。
  • Q:外键约束不生效? A:检查外键配置的field/refTable/refField是否正确,确保关联表已创建。

7.3 查询相关

  • Q:where条件中的$gt/$in等操作符不生效? A:检查条件格式是否正确,如$gt需传入对象格式:{ age: { $gt: 18 } }
  • Q:多表关联查询结果为空? A:检查include配置的foreignKey/targetKey是否正确,required为true时会过滤无关联的数据。

总结

核心要点回顾

  1. 该插件是UniApp X Android端的SQLite封装,核心入口为SQLiteHelper,模型化开发是核心特性;
  2. 核心能力包括数据库连接管理、模型定义、CRUD操作、事务、多表关联查询,所有操作均返回ExecuteResult类型结果;
  3. 开发规范:表名/字段名仅字母/数字且以字母开头,多表关联通过queryComplex实现,批量操作建议使用事务。

关键使用原则

  • 优先使用模型化开发(defineModel),减少原生SQL编写;
  • 复杂查询使用queryComplex,基础查询使用query
  • 所有条件查询均使用参数化方式(where对象),避免直接拼接SQL;
  • 操作完成后根据ExecuteResult的success字段判断是否成功,msg字段获取详细信息。

隐私、权限声明

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

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

插件不采集任何数据

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

暂无用户评论。