Flutter SQLite3 在鸿蒙平台的使用指南
插件介绍
sqlite3.dart 是一个强大的 Flutter 插件,提供了对 SQLite 数据库的直接访问能力。通过 Dart FFI(Foreign Function Interface)技术,该插件允许开发者在 Flutter 应用中高效地使用 SQLite 数据库,支持各种平台,包括鸿蒙(HarmonyOS)。

该插件的主要特点包括:
- 提供对 SQLite 数据库的完整访问权限
- 支持直接执行 SQL 语句和预编译语句
- 支持内存数据库和文件数据库
- 提供 WebAssembly 支持,可在 Web 平台使用
- 与
sqlite3_flutter_libs包配合使用,可在各种 Flutter 平台上提供最新的 SQLite 库
如何使用插件
1. 包的引入
由于这是一个自定义修改版本,需要通过 Git 形式引入。在项目的 pubspec.yaml 文件中添加以下依赖配置:
dependencies:
sqlite3:
git:
url: "https://gitcode.com/openharmony-tpc/fluttertpc_sqlite3.dart.git"
path: "sqlite3"
sqlite3_flutter_libs:
git:
url: "https://gitcode.com/openharmony-tpc/fluttertpc_sqlite3.dart.git"
path: "sqlite3_flutter_libs"
然后执行以下命令获取依赖:
flutter pub get
2. 基本使用方法
2.1 导入必要的包
import 'package:sqlite3/sqlite3.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart';
2.2 打开数据库
可以打开一个文件数据库或内存数据库:
// 打开内存数据库
final db = sqlite3.openInMemory();
// 或打开文件数据库
Future<Database> openFileDatabase() async {
final directory = await getApplicationDocumentsDirectory();
final dbPath = join(directory.path, 'my_database.db');
return sqlite3.open(dbPath);
}
2.3 执行 SQL 语句
// 创建表
db.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE
);
''');
// 插入数据
db.execute(
'INSERT INTO users (name, email) VALUES (?, ?)',
['张三', 'zhangsan@example.com']
);
// 查询数据
final result = db.execute('SELECT * FROM users');
for (final row in result) {
print('ID: ${row['id']}, Name: ${row['name']}, Email: ${row['email']}');
}
2.4 使用预编译语句
对于需要重复执行的 SQL 语句,使用预编译语句可以提高性能:
// 准备语句
final stmt = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)');
// 执行多次
stmt.execute(['李四', 'lisi@example.com']);
stmt.execute(['王五', 'wangwu@example.com']);
// 释放语句
stmt.dispose();
2.5 查询数据
// 查询所有用户
final selectStmt = db.prepare('SELECT * FROM users');
final ResultSet rows = selectStmt.select();
for (final row in rows) {
final id = row['id'] as int;
final name = row['name'] as String;
final email = row['email'] as String;
print('用户信息: $id - $name ($email)');
}
selectStmt.dispose();
// 使用参数查询
final findStmt = db.prepare('SELECT * FROM users WHERE name = ?');
final user = findStmt.select(['张三']).firstOrNull;
if (user != null) {
print('找到用户: ${user['name']}');
}
findStmt.dispose();
2.6 更新和删除数据
// 更新数据
db.execute('UPDATE users SET email = ? WHERE name = ?',
['zhangsan_new@example.com', '张三']);
// 删除数据
db.execute('DELETE FROM users WHERE id = ?', [1]);
2.7 关闭数据库
// 当不再需要数据库时,关闭它
db.dispose();
3. 鸿蒙平台特定注意事项
由于鸿蒙平台是基于 Linux 内核的,sqlite3.dart 插件可以通过 FFI 正常工作。以下是在鸿蒙平台上使用时的一些注意事项:
3.1 权限配置
在鸿蒙平台上使用文件数据库时,需要确保应用有正确的存储权限。在 entry/src/main/module.json5 文件中添加以下权限配置:
...
"requestPermissions": [
{
"name": "ohos.permission.READ_MEDIA",
"reason": "需要读取媒体文件",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
},
{
"name": "ohos.permission.WRITE_MEDIA",
"reason": "需要写入媒体文件",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
}
]
...
3.2 数据库文件路径
在鸿蒙平台上,使用 path_provider 包获取应用文档目录时,可能需要特别注意路径的正确性。建议使用以下方式获取数据库路径:
Future<String> getDatabasePath(String databaseName) async {
final directory = await getApplicationDocumentsDirectory();
return join(directory.path, databaseName);
}
4. 完整使用示例
以下是一个完整的示例,展示了如何在 Flutter 应用中使用 sqlite3.dart 插件:
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart';
import 'package:sqlite3/sqlite3.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
Widget build(BuildContext context) {
return MaterialApp(
title: 'SQLite3 鸿蒙示例',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'SQLite3 鸿蒙示例'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late Database _database;
List<Map<String, dynamic>> _users = [];
void initState() {
super.initState();
_initDatabase();
}
Future<void> _initDatabase() async {
// 获取数据库路径
final directory = await getApplicationDocumentsDirectory();
final dbPath = join(directory.path, 'my_database.db');
// 打开数据库
_database = sqlite3.open(dbPath);
// 创建表
_database.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE
);
''');
// 插入测试数据
_database.execute(
'INSERT OR IGNORE INTO users (name, email) VALUES (?, ?)',
['张三', 'zhangsan@example.com']
);
_database.execute(
'INSERT OR IGNORE INTO users (name, email) VALUES (?, ?)',
['李四', 'lisi@example.com']
);
// 加载数据
_loadUsers();
}
void _loadUsers() {
final result = _database.execute('SELECT * FROM users');
setState(() {
_users = result.toList();
});
}
void _addUser() {
final name = '用户${_users.length + 1}';
final email = 'user${_users.length + 1}@example.com';
_database.execute(
'INSERT INTO users (name, email) VALUES (?, ?)',
[name, email]
);
_loadUsers();
}
void dispose() {
// 关闭数据库
_database.dispose();
super.dispose();
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: ListView.builder(
itemCount: _users.length,
itemBuilder: (context, index) {
final user = _users[index];
return ListTile(
title: Text(user['name'] as String),
subtitle: Text(user['email'] as String),
trailing: Text('ID: ${user['id'] as int}'),
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: _addUser,
tooltip: '添加用户',
child: const Icon(Icons.add),
),
);
}
}
API 参考
主要类
Database
表示一个 SQLite 数据库连接。
主要方法:
execute(String sql, [List<Object?> parameters]): 执行 SQL 语句prepare(String sql): 预编译 SQL 语句dispose(): 关闭数据库连接
Statement
表示一个预编译的 SQL 语句。
主要方法:
execute([List<Object?> parameters]): 执行预编译语句select([List<Object?> parameters]): 执行查询并返回结果集dispose(): 释放语句
ResultSet
表示查询结果集。
主要属性:
length: 结果集中的行数columns: 列名列表
主要方法:
toList(): 将结果集转换为 Map 列表
总结
sqlite3.dart 是一个功能强大的 Flutter 插件,提供了对 SQLite 数据库的完整访问能力,支持在鸿蒙平台上使用。通过与 sqlite3_flutter_libs 包配合使用,可以确保在各种 Flutter 平台上使用最新的 SQLite 库。
使用该插件,开发者可以轻松地在 Flutter 应用中实现数据库功能,包括创建表、插入数据、查询数据、更新数据和删除数据等操作。该插件的 API 设计简洁明了,易于使用,适合各种规模的项目。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐



所有评论(0)