一、插件介绍

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

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐