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

Flutter 三方库 sqflite 鸿蒙化本地数据库实战

摘要

sqflite 是 Flutter 生态中用于实现本地 SQLite 数据库的常用插件,支持创建数据库、表管理、CRUD 操作等核心功能。本文基于 OpenHarmony TPC 仓库的适配版本,详细讲解 sqflite 在鸿蒙项目中的接入流程、数据库创建、核心 API 使用及常见问题排查,并附真实设备运行截图验证。

核心要点

  • 掌握数据库创建与打开
  • 实现表的创建与升级
  • 熟练使用 CRUD 操作

一、数据库架构

数据库操作

CREATE

READ

UPDATE

DELETE

sqflite 功能

openDatabase

execute

insert

query

update

delete

Flutter 应用

sqflite

OpenHarmony SQLite

创建数据库

创建表

CRUD 操作

二、参考来源

资源名称 链接
OpenHarmony TPC Flutter 仓库 AtomGit
sqflite pub.dev sqflite

三、接入步骤

3.1 配置 pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  
  sqflite:
    git:
      url: https://atomgit.com/openharmony-tpc/flutter_packages.git
      path: packages/sqflite/sqflite
  
  path_provider:
    git:
      url: https://atomgit.com/openharmony-tpc/flutter_packages.git
      path: packages/path_provider/path_provider

3.2 核心代码示例

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DatabaseService {
  static Database? _database;
  static const String _dbName = 'demo.db';
  static const int _dbVersion = 1;

  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await _initDatabase();
    return _database!;
  }

  Future<Database> _initDatabase() async {
    final dbPath = await getDatabasesPath();
    final path = join(dbPath, _dbName);

    return await openDatabase(
      path,
      version: _dbVersion,
      onCreate: _onCreate,
      onUpgrade: _onUpgrade,
    );
  }

  Future<void> _onCreate(Database db, int version) async {
    await db.execute('''
      CREATE TABLE users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT NOT NULL,
        age INTEGER
      )
    ''');
  }

  Future<void> _onUpgrade(Database db, int oldVersion, int newVersion) async {
    // 处理数据库升级
  }

  // 插入数据
  Future<int> insert(String table, Map<String, dynamic> data) async {
    final db = await database;
    return await db.insert(table, data);
  }

  // 查询数据
  Future<List<Map<String, dynamic>>> query(
    String table, {
    bool? distinct,
    List<String>? columns,
    String? where,
    List<Object?>? whereArgs,
    String? orderBy,
    int? limit,
  }) async {
    final db = await database;
    return await db.query(
      table,
      distinct: distinct,
      columns: columns,
      where: where,
      whereArgs: whereArgs,
      orderBy: orderBy,
      limit: limit,
    );
  }

  // 更新数据
  Future<int> update(
    String table,
    Map<String, dynamic> data, {
    String? where,
    List<Object?>? whereArgs,
  }) async {
    final db = await database;
    return await db.update(table, data, where: where, whereArgs: whereArgs);
  }

  // 删除数据
  Future<int> delete(
    String table, {
    String? where,
    List<Object?>? whereArgs,
  }) async {
    final db = await database;
    return await db.delete(table, where: where, whereArgs: whereArgs);
  }

  // 执行原始 SQL
  Future<List<Map<String, dynamic>>> rawQuery(String sql) async {
    final db = await database;
    return await db.rawQuery(sql);
  }

  Future<void> close() async {
    final db = await database;
    await db.close();
    _database = null;
  }
}

3.3 完整使用示例

import 'package:flutter/material.dart';

class DatabaseDemo extends StatefulWidget {
  
  _DatabaseDemoState createState() => _DatabaseDemoState();
}

class _DatabaseDemoState extends State<DatabaseDemo> {
  final DatabaseService _dbService = DatabaseService();
  List<Map<String, dynamic>> _users = [];
  final _nameController = TextEditingController();
  final _emailController = TextEditingController();
  final _ageController = TextEditingController();

  
  void initState() {
    super.initState();
    _loadUsers();
  }

  Future<void> _loadUsers() async {
    final users = await _dbService.query('users', orderBy: 'id DESC');
    if (mounted) {
      setState(() {
        _users = users;
      });
    }
  }

  Future<void> _addUser() async {
    final user = {
      'name': _nameController.text,
      'email': _emailController.text,
      'age': int.tryParse(_ageController.text) ?? 0,
    };
    await _dbService.insert('users', user);
    _nameController.clear();
    _emailController.clear();
    _ageController.clear();
    _loadUsers();
  }

  Future<void> _deleteUser(int id) async {
    await _dbService.delete('users', where: 'id = ?', whereArgs: [id]);
    _loadUsers();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SQLite Demo'),
      ),
      body: Column(
        children: [
          Padding(
            padding: EdgeInsets.all(16),
            child: Column(
              children: [
                TextField(
                  controller: _nameController,
                  decoration: InputDecoration(labelText: '姓名'),
                ),
                TextField(
                  controller: _emailController,
                  decoration: InputDecoration(labelText: '邮箱'),
                ),
                TextField(
                  controller: _ageController,
                  decoration: InputDecoration(labelText: '年龄'),
                  keyboardType: TextInputType.number,
                ),
                SizedBox(height: 16),
                ElevatedButton(
                  onPressed: _addUser,
                  child: Text('添加用户'),
                ),
              ],
            ),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: _users.length,
              itemBuilder: (context, index) {
                final user = _users[index];
                return ListTile(
                  leading: CircleAvatar(child: Text('${user['id']}')),
                  title: Text(user['name']),
                  subtitle: Text('${user['email']} - ${user['age']}岁'),
                  trailing: IconButton(
                    icon: Icon(Icons.delete, color: Colors.red),
                    onPressed: () => _deleteUser(user['id']),
                  ),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

四、验证步骤

步骤 验证内容 预期结果
Step 1 数据库创建 数据库文件被创建
Step 2 添加用户 数据成功写入
Step 3 查询用户 返回用户列表
Step 4 删除用户 数据被删除

五、常见问题排查

现象 根因 处理方式
数据库打开失败 路径配置错误 检查 getDatabasesPath
表创建失败 SQL 语法错误 检查 CREATE TABLE 语句
数据插入失败 主键冲突 检查唯一约束

六、运行成功截图

未添加数据状态

应用首页

添加两个测试用户到数据库

两个测试数据

七、总结

sqflite 是实现本地数据持久化的核心插件,在 OpenHarmony 平台上的适配完善。通过 SQLite 数据库,可以实现复杂数据的本地存储,是数据管理类应用的必备工具。


附录:Schema.org 结构化数据

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "Flutter 三方库 sqflite 鸿蒙化本地数据库实战",
  "description": "基于 OpenHarmony TPC 仓库,详细讲解 sqflite 在鸿蒙项目中的接入流程、数据库创建与 CRUD 操作功能实现。",
  "author": { "@type": "Person", "name": "OpenHarmony 跨平台开发者" },
  "publisher": { "@type": "Organization", "name": "OpenHarmony 跨平台社区", "url": "https://openharmonycrossplatform.csdn.net" },
  "datePublished": "2026-05-07",
  "dateModified": "2026-05-07",
  "mainEntityOfPage": "https://openharmonycrossplatform.csdn.net",
  "keywords": ["开源鸿蒙", "OpenHarmony", "Flutter for OpenHarmony", "sqflite", "本地数据库", "SQLite", "三方库适配"],
  "inLanguage": "zh-CN"
}
</script>
Logo

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

更多推荐