Flutter跨平台数据库测试工具sqflite_test鸿蒙化使用指南
摘要:sqflite_test是一款专为Flutter开发优化的SQLite测试工具,特别适配OpenHarmony平台。它提供完整的数据库测试方案,包括基础CRUD操作、触发器、BigInt处理、全文搜索分词器和跨数据库查询等高级功能。该插件支持OpenHarmony API 9+和Flutter 3.0+,通过Git方式引入依赖,提供了详细的API示例代码,涵盖数据库创建、表操作、数据增删改查

一、插件介绍
sqflite_test是一个专为Flutter开发者设计的SQLite数据库测试工具,特别针对OpenHarmony平台进行了适配和优化。它提供了一套完整的数据库操作测试方案,包括基本CRUD操作、触发器、BigInt大整数处理、全文搜索分词器以及跨数据库查询等高级功能。

主要功能特点
- 基础数据库操作:支持表的创建、数据的插入、查询、更新和删除
- 触发器支持:实现数据库操作的自动触发机制
- BigInt处理:支持超大整数的存储和查询
- 全文搜索:集成分词器,支持高效的文本搜索
- 跨数据库查询:支持多个数据库的附加和联合查询
- OpenHarmony适配:完全兼容OpenHarmony API 9+平台
二、环境设置
1. 系统要求
- OpenHarmony API 9+
- Flutter SDK 3.0+
- DevEco Studio 3.0+
2. 依赖配置
由于sqflite_test是针对OpenHarmony平台优化的自定义版本,需要通过Git方式引入。在项目的pubspec.yaml文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
sqflite:
git:
url: "https://atomgit.com/openharmony-sig/flutter_sqflite.git"
path: "sqflite"
fluttertoast:
git:
url: "https://atomgit.com/openharmony-sig/flutter_fluttertoast.git"
path: "fluttertoast"
然后执行以下命令获取依赖:
flutter pub get
三、API使用示例
1. 基础数据库操作
打开数据库
import 'package:sqflite/sqflite.dart';
Database? _database;
String _dbName = "test.db";
Future<void> _openDatabase() async {
try {
_database = await openDatabase(_dbName);
final path = await getDatabasesPath();
print("数据库打开成功:$path");
} catch (error) {
print("数据库打开失败:$error");
}
}
创建表
Future<void> _createTable() async {
if (_database != null) {
try {
await _database!.execute("CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");
print("表创建成功");
} catch (error) {
print("表创建失败:$error");
}
}
}
插入数据
Future<void> _insertData() async {
if (_database != null) {
try {
final id = await _database!.insert('users', {'name': 'John', 'age': 25});
print("数据插入成功:id=$id");
} catch (error) {
print("数据插入失败:$error");
}
}
}
查询数据
Future<void> _queryData() async {
if (_database != null) {
final maps = await _database!.query('users');
print("查询结果:");
for (final map in maps) {
print(map.toString());
}
}
}
更新数据
Future<void> _updateData() async {
if (_database != null) {
try {
final changeRows = await _database!.update('users', {'name': 'Jack', 'age': 28}, where: 'id = ?', whereArgs: [1]);
print("数据更新成功,更新了$changeRows行");
} catch (error) {
print("数据更新失败:$error");
}
}
}
删除数据
Future<void> _deleteData() async {
if (_database != null) {
try {
final count = await _database!.rawDelete("DELETE FROM users WHERE id = ?", [1]);
print("数据删除成功,删除了$count行");
} catch (error) {
print("数据删除失败:$error");
}
}
}
2. 触发器使用
Future<void> _createTableWithTrigger() async {
if (_database != null) {
try {
// 创建表
await _database!.execute('''CREATE TABLE IF NOT EXISTS mh_habits (
id_ INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
uuid TEXT NOT NULL UNIQUE
)''');
// 创建触发器
await _database!.execute('''
CREATE TRIGGER item_update_trigger
AFTER UPDATE ON mh_habits
BEGIN
UPDATE mh_habits SET name = '触发器更改名称' WHERE uuid = NEW.uuid;
END
''');
print("表和触发器创建成功");
} catch (error) {
print("创建失败:$error");
}
}
}
3. BigInt大整数处理
Future<void> _createBigIntTable() async {
if (_database != null) {
try {
// 使用UNLIMITED INT类型支持BigInt
await _database!.execute("CREATE TABLE bigint_test(id INTEGER PRIMARY KEY, value UNLIMITED INT)");
// 插入最大BigInt值
final maxBigInt = 9223372036854775807;
await _database!.insert('bigint_test', {'value': maxBigInt});
print("BigInt表创建和数据插入成功");
} catch (error) {
print("操作失败:$error");
}
}
}
4. 全文搜索分词器
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
class DBHelper {
final SQL_CREATE_TABLE = "CREATE VIRTUAL TABLE example USING fts4(name, content, tokenize=icu zh_CN)";
Future<List<Map<String, Object?>>> setupDatabase() async {
final databasePath = await getDatabasesPath();
final path = join(databasePath, "fts_example.db");
final database = await openDatabase(
path,
version: 1,
onCreate: (Database db, int version) async {
// 创建FTS虚拟表
await db.execute(SQL_CREATE_TABLE);
// 插入测试数据
await db.insert('example', {
'name': '测试文档',
'content': '这是一个用于全文搜索测试的示例文本,包含中文和英文内容'
});
},
);
// 执行全文搜索
final results = await database.query(
'example',
where: 'content MATCH ?',
whereArgs: ['搜索测试']
);
return results;
}
}
5. 跨数据库查询
Future<List<Map<String, Object?>>> attachTest() async {
// 初始化两个数据库
final db1 = await initDatabase('main.db');
final db2 = await initDatabase('secondary.db');
// 插入示例数据
await db1.insert('users', {'name': 'Alice'});
await db2.insert('orders', {'product': 'Laptop', 'user_id': 1});
// 关闭第二个数据库以释放文件锁
await db2.close();
// 获取数据库路径
final path = join(await getDatabasesPath(), 'secondary.db');
// 附加第二个数据库
await db1.execute('ATTACH DATABASE ? AS secondary', [path]);
// 执行跨数据库查询
final results = await db1.rawQuery('''
SELECT users.name, orders.product
FROM users
INNER JOIN secondary.orders ON users.id = orders.user_id
''');
// 分离数据库
await db1.execute('DETACH DATABASE secondary');
// 关闭数据库
await db1.close();
return results;
}
Future<Database> initDatabase(String name) async {
final path = join(await getDatabasesPath(), name);
return openDatabase(
path,
version: 1,
onCreate: (db, version) async {
if (name == 'main.db') {
await db.execute('''
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT
)
''');
} else {
await db.execute('''
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
product TEXT,
user_id INTEGER
)
''');
}
},
);
}
四、完整应用示例
下面是一个完整的Flutter应用示例,展示如何使用sqflite_test进行数据库测试:
import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'dart:math';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
Widget build(BuildContext context) {
return MaterialApp(
title: 'sqflite_test示例',
theme: ThemeData(primarySwatch: Colors.blue),
home: const DatabaseTestHome(),
);
}
}
class DatabaseTestHome extends StatefulWidget {
const DatabaseTestHome({super.key});
State<DatabaseTestHome> createState() => _DatabaseTestHomeState();
}
class _DatabaseTestHomeState extends State<DatabaseTestHome> {
Database? _database;
String _dbName = "${Random().nextInt(36000)}.db";
String _result = "";
void initState() {
super.initState();
_initDatabase();
}
Future<void> _initDatabase() async {
try {
_database = await openDatabase(
_dbName,
onCreate: (db, version) async {
await db.execute("CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");
},
version: 1,
);
setState(() {
_result = "数据库初始化成功";
});
} catch (error) {
setState(() {
_result = "数据库初始化失败:$error";
});
}
}
Future<void> _insertData() async {
if (_database != null) {
try {
final id = await _database!.insert('users', {'name': 'Test User', 'age': 30});
setState(() {
_result = "数据插入成功:id=$id";
});
} catch (error) {
setState(() {
_result = "数据插入失败:$error";
});
}
}
}
Future<void> _queryData() async {
if (_database != null) {
final maps = await _database!.query('users');
setState(() {
_result = "查询结果:\n${maps.map((map) => map.toString()).join("\n")}";
});
}
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('sqflite_test示例')),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child: Text(_result),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
ElevatedButton(onPressed: _insertData, child: const Text('插入数据')),
ElevatedButton(onPressed: _queryData, child: const Text('查询数据')),
],
),
],
),
);
}
}
五、总结
sqflite_test是一个功能强大的Flutter数据库测试工具,为OpenHarmony平台提供了完整的SQLite数据库操作测试方案。它不仅支持基础的CRUD操作,还提供了触发器、BigInt处理、全文搜索和跨数据库查询等高级功能,能够满足开发者在数据库开发和测试过程中的各种需求。
通过本文的介绍,您应该已经掌握了sqflite_test的基本使用方法和核心功能。在实际开发中,您可以根据项目需求灵活运用这些功能,构建高效、稳定的数据库应用。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐
所有评论(0)