在鸿蒙平台使用 sqlite3.dart 插件

插件介绍

sqlite3.dart 是一个 Dart 包,用于通过 dart:ffi 直接访问 SQLite 数据库。该插件已适配鸿蒙平台,提供了以下核心功能:

  1. 纯 Dart 实现:不依赖 Flutter,可以在 Flutter 应用或独立 Dart 应用中使用
  2. 高性能:通过 FFI 直接调用 SQLite 原生库,性能优于其他 SQLite 插件
  3. 完整的 SQL 支持:支持所有 SQLite 功能,包括事务、预处理语句、视图等
  4. 多平台支持:支持鸿蒙、Android、iOS、Windows、macOS 和 Linux
  5. 轻量级:体积小,不包含冗余代码

安装与使用

1. 安装方式

在项目的 pubspec.yaml 文件中添加以下依赖配置:

yaml 复制代码
dependencies:
  sqlite3:
    git:
      url: "https://atomgit.com/fluttertpc/fluttertpc_sqlite3.dart.git"
      path: "sqlite3"
  sqlite3_flutter_libs:
    git:
      url: "https://atomgit.com/fluttertpc/fluttertpc_sqlite3.dart.git"
      path: "sqlite3_flutter_libs"

执行命令安装依赖:

bash 复制代码
flutter pub get

2. 基本使用示例

2.1 打开数据库
dart 复制代码
import 'package:sqlite3/sqlite3.dart';

void main() {
  // 打开内存数据库
  final db = sqlite3.openInMemory();

  // 打开文件数据库
  // final db = sqlite3.open('path/to/database.db');

  print('Database opened successfully');
}
2.2 执行 SQL 语句
dart 复制代码
import 'package:sqlite3/sqlite3.dart';

void main() {
  final db = sqlite3.openInMemory();

  // 创建表
  db.execute('''
    CREATE TABLE users (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT NOT NULL,
      email TEXT NOT NULL UNIQUE
    )
  ''');

  // 插入数据
  db.execute('''
    INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com')
  ''');

  print('Table created and data inserted successfully');
}
2.3 查询数据
dart 复制代码
import 'package:sqlite3/sqlite3.dart';

void main() {
  final db = sqlite3.openInMemory();

  // 查询数据
  final result = db.select('SELECT * FROM users');

  // 遍历结果
  for (final row in result) {
    print('User: ${row['name']} (${row['email']})');
  }
}
2.4 预处理语句
dart 复制代码
import 'package:sqlite3/sqlite3.dart';

void main() {
  final db = sqlite3.openInMemory();

  // 创建预处理语句
  final stmt = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)');

  // 绑定参数并执行
  stmt.execute(['Alice', 'alice@example.com']);
  stmt.execute(['Bob', 'bob@example.com']);

  // 关闭预处理语句
  stmt.dispose();

  print('Data inserted successfully using prepared statement');
}
2.5 事务处理
dart 复制代码
import 'package:sqlite3/sqlite3.dart';

void main() {
  final db = sqlite3.openInMemory();

  // 开始事务
  db.execute('BEGIN TRANSACTION');

  try {
    // 执行多个操作
    db.execute('INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com')');
    db.execute('INSERT INTO users (name, email) VALUES ('David', 'david@example.com')');

    // 提交事务
    db.execute('COMMIT');
    print('Transaction committed successfully');
  } catch (e) {
    // 回滚事务
    db.execute('ROLLBACK');
    print('Transaction rolled back: $e');
  }
}
2.6 关闭数据库
dart 复制代码
import 'package:sqlite3/sqlite3.dart';

void main() {
  final db = sqlite3.openInMemory();

  // 执行操作...

  // 关闭数据库
  db.dispose();
  print('Database closed successfully');
}

3. 高级使用示例

3.1 批量插入
dart 复制代码
import 'package:sqlite3/sqlite3.dart';

void main() {
  final db = sqlite3.openInMemory();

  // 创建表
  db.execute('''
    CREATE TABLE products (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT NOT NULL,
      price REAL NOT NULL
    )
  ''');

  // 批量插入
  final stmt = db.prepare('INSERT INTO products (name, price) VALUES (?, ?)');

  final products = [
    ['Product 1', 10.99],
    ['Product 2', 19.99],
    ['Product 3', 5.99],
  ];

  for (final product in products) {
    stmt.execute(product);
  }

  stmt.dispose();
  print('Batch insert completed successfully');
}
3.2 事务处理
dart 复制代码
import 'package:sqlite3/sqlite3.dart';

void main() {
  final db = sqlite3.openInMemory();

  // 开始事务
  db.execute('BEGIN TRANSACTION');

  try {
    // 执行多个操作
    db.execute('INSERT INTO users (name, email) VALUES ('Eve', 'eve@example.com')');
    db.execute('INSERT INTO users (name, email) VALUES ('Frank', 'frank@example.com')');

    // 提交事务
    db.execute('COMMIT');
    print('Transaction committed successfully');
  } catch (e) {
    // 回滚事务
    db.execute('ROLLBACK');
    print('Transaction rolled back: $e');
  }
}

4. 核心 API 说明

方法名 功能描述 参数说明 返回值类型
open(String path) 打开文件数据库 path:数据库文件路径 Database
openInMemory() 打开内存数据库 / Database
execute(String sql) 执行 SQL 语句 sql:要执行的 SQL 语句 void
select(String sql) 执行查询语句 sql:要执行的查询语句 List<Map<String, dynamic>>
prepare(String sql) 创建预处理语句 sql:要预处理的 SQL 语句 PreparedStatement
dispose() 关闭数据库 / void

约束与限制

兼容性

该插件已在以下环境中进行了测试:

  • Flutter: 3.7.12-ohos-1.0.6; SDK: 5.0.0(12); IDE: DevEco Studio: 5.0.13.200; ROM: 5.1.0.120 SP3;
  • Flutter: 3.22.1-ohos-1.0.1; SDK: 5.0.0(12); IDE: DevEco Studio: 5.0.13.200; ROM: 5.1.0.120 SP3;

注意事项

  1. 文件路径:在鸿蒙平台上,需要使用正确的文件路径来存储数据库文件
  2. 权限:需要获取文件读写权限才能访问数据库文件
  3. 线程安全:SQLite 不是线程安全的,需要在单线程中使用或使用锁机制
  4. 资源管理:需要及时关闭数据库和预处理语句,以释放资源

总结

sqlite3.dart 插件为鸿蒙平台提供了一个高性能、轻量级的 SQLite 数据库解决方案。通过该插件,开发者可以直接使用 SQL 语句进行数据库操作,无需依赖其他 ORM 框架。该插件适用于各种需要本地数据存储的场景,包括离线应用、缓存数据等。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

相关推荐
3 小时前
鸿蒙——布局——相对布局
华为·harmonyos·
2501_946230983 小时前
Cordova&OpenHarmony维修记录管理指南
安全·harmonyos
w139548564224 小时前
在鸿蒙平台使用 sqlite3 插件
华为·sqlite·harmonyos
搬砖的kk5 小时前
hnpcli 适配 OpenHarmony PC 完整指南
elasticsearch·华为·harmonyos
奔跑的露西ly5 小时前
【HarmonyOS NEXT】Stage模型UIAbility组件
华为·harmonyos
特立独行的猫a5 小时前
QT开发鸿蒙PC应用:第一个Qt Widget应用入门
数据库·qt·harmonyos·鸿蒙pc·qtwidget
l1t5 小时前
sqlite递归查询指定搜索顺序的方法
数据库·sql·sqlite·dfs·递归·cte
灰灰勇闯IT6 小时前
放弃 HarmonyOS 7?OpenHarmony 6.1 LTS 版本适配指南(含老机型兼容技巧)
人工智能·计算机视觉·harmonyos
搬砖的kk7 小时前
实现 Lycium 智能产物检查机制【鸿蒙pc实践系列】
chrome·华为·harmonyos