218 lines
6.2 KiB
Markdown
218 lines
6.2 KiB
Markdown
# x-sqlite-s
|
||
|
||
## 简介
|
||
x-sqlite-s 是一个用于 uni-appx 的 SQLite 数据库操作插件,支持基本的数据库。
|
||
|
||
### 兼容性
|
||
|
||
| Harmony | IOS | Android | WEB | 小程序 |
|
||
| --- | --- | --- | --- | --- |
|
||
| 支持 | 支持 | 支持 | 支持 | x |
|
||
|
||
## 安装
|
||
在插件市场搜索并导入 x-sqlite-s 插件。
|
||
|
||
## 特别注意
|
||
配置中的密码等加密功能,未实现,只是一个预设功能.
|
||
|
||
## web注意事项
|
||
|
||
请到插件目录内复制static到你的根目录static即可。否则web无法使用。
|
||
|
||
## 类型定义
|
||
|
||
### SQLiteConfig 配置项
|
||
**鸿蒙不支持自定义其它目录**为了全平台兼容,不建议设置defaultDirectory,
|
||
在安卓和ios中defaultDirectory它可指定为缓存目录,下载目录,用户目录等等沙盒目录。
|
||
但鸿蒙它是固定在`应用目录/rdb/自定义目录`,下,因为实际上是被固定在了`应用目录/rdb/`下.
|
||
因此差异非常大。故,鸿蒙端defaultDirectory我将不会生效。仅在安卓和ios下生效。就算你写了我也不使用。
|
||
|
||
```typescript
|
||
type SQLiteConfig = {
|
||
password?: string; // 数据库密码
|
||
encryption?: boolean; // 是否启用加密
|
||
defaultDirectory?: string; // 数据库文件存储目录,鸿蒙不支持,它的目录是固定的加密区目录,无法像安卓,ios那样保存到其它目录:比如用户目录,缓存目录等。
|
||
locateFile?: (filename: string) => string; // 自定义文件位置,web专用属性,默认内置
|
||
}
|
||
```
|
||
|
||
### SQLiteResult 返回结果
|
||
```typescript
|
||
type SQLiteResult = {
|
||
rows?: any[][]; // 查询结果行数据
|
||
columns?: string[]; // 列名
|
||
maps?: any[]; // 查询结果对象数组,可通过列名访问数据
|
||
changes?: number; // 影响的行数
|
||
lastInsertRowid?: number; // 最后插入的行ID
|
||
error?: string; // 错误信息
|
||
}
|
||
```
|
||
|
||
### SQLiteExecuteBatchParams 批量执行参数
|
||
```typescript
|
||
type SQLiteExecuteBatchParams = {
|
||
sql: string; // SQL语句
|
||
params?: any[]; // 参数列表
|
||
}
|
||
```
|
||
|
||
## API 说明
|
||
|
||
### 创建数据库
|
||
```javascript
|
||
createDb(filename?: string): boolean
|
||
// web端是Promise函数,执行时可以await createDb
|
||
// app是同步操作,不是Promise
|
||
```
|
||
创建或打开一个数据库。如果未指定文件名,默认为 "sqlite.db"。
|
||
|
||
### 执行SQL查询
|
||
```javascript
|
||
run(sql: string, params: any[] = []): SQLiteResult
|
||
```
|
||
执行一条SQL语句,支持参数绑定。
|
||
|
||
### 查询数据
|
||
```javascript
|
||
query(sql: string, params: any[] = []): SQLiteResult
|
||
```
|
||
执行查询语句并返回结果集。
|
||
|
||
### 插入数据
|
||
```javascript
|
||
insert(table: string, data: object): SQLiteResult
|
||
```
|
||
向指定表插入数据。
|
||
|
||
### 更新数据
|
||
```javascript
|
||
update(table: string, data: object, where: string, params: any[] = []): SQLiteResult
|
||
```
|
||
更新表中的数据。
|
||
|
||
### 删除数据
|
||
```javascript
|
||
delete(table: string, where: string, params: any[] = []): SQLiteResult
|
||
```
|
||
删除表中的数据。
|
||
|
||
### 事务处理
|
||
```javascript
|
||
beginTransaction(): SQLiteResult // 开始事务
|
||
commit(): SQLiteResult // 提交事务
|
||
rollback(): SQLiteResult // 回滚事务
|
||
```
|
||
|
||
### 批量执行
|
||
```javascript
|
||
executeBatch(statements: SQLiteExecuteBatchParams[]): SQLiteResult[]
|
||
```
|
||
批量执行SQL语句,支持事务。
|
||
|
||
### 数据库文件管理
|
||
|
||
**createDb,loadFromBuffer,loadLocal三个函数**
|
||
**web端是Promise函数**
|
||
**app是同步操作,不是Promise**
|
||
|
||
```javascript
|
||
createDb(filename?: string): boolean // 创建一个本地数据库,重命的重复创建不会覆盖,只是读取已有的数据库.
|
||
saveLocal(filename?: string): SQLiteResult // 保存数据库到本地
|
||
loadLocal(filename: string): SQLiteResult // 从本地加载数据库
|
||
getDatabasePath(): string | null // app端获取数据库备份临时文件路径
|
||
getDatabasePath(): Uint8Array | null // web端返回的是二进制数据
|
||
loadFromBuffer(buffer: Uint8Array):void // web端专用函数,用来从进制制数据加载远程数据库
|
||
setDefaultDirectory(directory: string): void // 设置数据库文件存储目录
|
||
setPassword(password: string|null): void // 设置数据库密码,null或空值表示删除密码
|
||
```
|
||
|
||
### 表操作
|
||
```javascript
|
||
tableExists(tableName: string): boolean // 检查表是否存在
|
||
createTable(tableName: string, columns: UTSJSONObject): SQLiteResult // 创建表
|
||
dropTable(tableName: string): SQLiteResult // 删除表
|
||
```
|
||
|
||
## 使用示例
|
||
|
||
### 基本操作
|
||
```javascript
|
||
import {xSqlite} from "@/uni_modules/x-sqlite-s"
|
||
|
||
// 创建数据库实例并配置
|
||
const db = new xSqlite({
|
||
encryption: true,
|
||
password: "mypassword",
|
||
defaultDirectory: "/custom/db/path"
|
||
});
|
||
|
||
// 创建数据库
|
||
db.createDb("mydb");
|
||
|
||
// 创建表
|
||
db.createTable("users", {
|
||
"id": "INTEGER PRIMARY KEY AUTOINCREMENT",
|
||
"name": "TEXT",
|
||
"age": "INTEGER"
|
||
});
|
||
|
||
// 插入数据
|
||
db.insert("users", {
|
||
name: "张三",
|
||
age: 25
|
||
});
|
||
|
||
// 查询数据
|
||
const result = db.query("SELECT * FROM users WHERE age > ?", [20]);
|
||
console.log(result.rows); // 通过数组下标访问:[[1, "张三", 25], [2, "李四", 30]]
|
||
console.log(result.maps); // 通过列名访问:[{"id": 1, "name": "张三", "age": 25}, {"id": 2, "name": "李四", "age": 30}]
|
||
```
|
||
|
||
### 事务使用
|
||
```javascript
|
||
// 开始事务
|
||
db.beginTransaction();
|
||
|
||
try {
|
||
db.insert("users", { name: "李四", age: 30 });
|
||
db.insert("users", { name: "王五", age: 35 });
|
||
db.commit();
|
||
} catch (e) {
|
||
db.rollback();
|
||
}
|
||
```
|
||
|
||
### 批量操作
|
||
```javascript
|
||
const statements = [
|
||
{
|
||
sql: "INSERT INTO users (name, age) VALUES (?, ?)",
|
||
params: ["赵六", 40]
|
||
},
|
||
{
|
||
sql: "UPDATE users SET age = ? WHERE name = ?",
|
||
params: [45, "张三"]
|
||
}
|
||
];
|
||
|
||
db.executeBatch(statements);
|
||
```
|
||
|
||
### 数据库配置管理
|
||
```javascript
|
||
// 更改数据库存储目录
|
||
db.setDefaultDirectory("/new/db/path");
|
||
|
||
// 更新数据库密码
|
||
db.setPassword("newpassword");
|
||
|
||
// 移除数据库密码
|
||
db.setPassword(null);
|
||
```
|
||
|
||
## 注意事项
|
||
1. 在进行数据库操作前,确保已经成功创建/打开数据库
|
||
2. 使用参数绑定来防止SQL注入
|
||
3. 大量数据操作时建议使用事务
|
||
4. 及时关闭不再使用的数据库连接
|
||
5. 加密数据库需要在创建时指定密码 |