插件介绍

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

Logo

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

更多推荐