Flutter跨平台开发鸿蒙化Floor使用指南

1. Floor插件介绍

Floor是一个Flutter平台上的SQLite数据库抽象层,提供了类型安全的对象关系映射(ORM)功能。它基于SQLite构建,通过代码生成简化了数据库操作,让开发者能够使用面向对象的方式与数据库进行交互。

Floor的主要特点包括:

  • 类型安全的数据库操作
  • 基于注解的简洁API设计
  • 自动代码生成,减少样板代码
  • 支持事务管理
  • 轻量级设计,性能高效

2. 环境搭建

在开始使用Floor之前,需要确保开发环境已经正确配置:

2.1 Flutter环境要求

  • Flutter SDK版本:≥3.7.0
  • Dart SDK版本:≥2.19.6

2.2 OpenHarmony环境要求

  • OpenHarmony SDK版本:API 9及以上
  • DevEco Studio版本:3.0及以上

3. 包的引入

由于本项目使用的是自定义修改版本的Floor和sqflite,需要通过AtomGit的方式引入依赖。在项目的pubspec.yaml文件中添加以下配置:

dependencies:
  flutter:
    sdk: flutter

  # 添加Floor依赖
  floor: ^1.4.2

  # 添加sqflite相关依赖的覆盖配置
  sqflite_common:
    git:
      url: "https://atomgit.com/openharmony-sig/flutter_sqflite.git"
      path: "sqflite_common"
  sqflite:
    git:
      url: "https://atomgit.com/openharmony-sig/flutter_sqflite.git"
      path: "sqflite"
  sqflite_common_ffi:
    git:
      url: "https://atomgit.com/openharmony-sig/flutter_sqflite.git"
      path: "sqflite_common_ffi"

  path: 1.8.3

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^2.0.0

  # 添加Floor代码生成器依赖
  floor_generator: ^1.4.2
  build_runner: ^2.3.3

添加依赖后,运行以下命令获取包:

flutter pub get

4. API调用

Floor的核心API围绕实体类(Entity)、数据访问对象(DAO)和数据库(Database)三个主要概念展开。

4.1 实体类定义

实体类是数据库表的映射,使用@entity注解标记:

import 'package:floor/floor.dart';


class User {
  
  final int? id; // 自动生成ID,设置为null

  final String name;
  final int age;

  User(this.id, this.name, this.age);
}

4.2 数据访问对象(DAO)

DAO定义了对数据库表的操作,使用@dao注解标记:

import 'package:floor/floor.dart';
import 'user.dart';


abstract class UserDao {
  ('SELECT * FROM User')
  Future<List<User>> findAllUsers();

  
  Future<void> insertUser(User user);

  ('SELECT * FROM User WHERE id = :id')
  Future<User?> findUserById(int id);

  
  Future<void> updateUser(User user);

  
  Future<void> deleteUser(User user);
}

4.3 数据库定义

数据库类使用@Database注解标记,包含实体类和DAO的引用:

import 'dart:async';
import 'package:floor/floor.dart';
import 'user.dart';
import 'user_dao.dart';

// 自动生成的代码文件
part 'database.g.dart';

(version: 1, entities: [User])
abstract class AppDatabase extends FloorDatabase {
  UserDao get userDao;
}

4.4 代码生成

定义好实体类、DAO和数据库后,需要生成数据库操作的代码:

flutter pub run build_runner build

4.5 数据库初始化

在应用程序中初始化数据库:

final database = await $FloorAppDatabase.databaseBuilder('app_database.db').build();

4.6 数据库操作

使用DAO进行数据库操作:

// 获取DAO实例
final userDao = database.userDao;

// 插入数据
await userDao.insertUser(User(null, '张三', 25));

// 查询所有数据
final allUsers = await userDao.findAllUsers();

// 根据ID查询数据
final user = await userDao.findUserById(1);

// 更新数据
await userDao.updateUser(User(1, '张三', 26));

// 删除数据
await userDao.deleteUser(user!);

5. 代码示例

下面是一个完整的示例,展示如何在Flutter OpenHarmony应用中使用Floor:

5.1 项目结构

lib/
├── database.dart        # 数据库定义
├── database.g.dart      # 自动生成的代码
├── main.dart            # 应用入口
├── user.dart            # 用户实体类
└── user_dao.dart        # 用户数据访问对象

5.2 实体类定义

// lib/user.dart
import 'package:floor/floor.dart';


class User {
  
  final int? id;

  final String name;
  final int age;

  User(this.id, this.name, this.age);
}

5.3 数据访问对象定义

// lib/user_dao.dart
import 'package:floor/floor.dart';
import 'user.dart';


abstract class UserDao {
  ('SELECT * FROM User')
  Future<List<User>> findAllUsers();

  
  Future<void> insertUser(User user);

  ('SELECT * FROM User WHERE id = :id')
  Future<User?> findUserById(int id);
}

5.4 数据库定义

// lib/database.dart
import 'dart:async';
import 'package:floor/floor.dart';
import 'user.dart';
import 'user_dao.dart';

part 'database.g.dart';

(version: 1, entities: [User])
abstract class AppDatabase extends FloorDatabase {
  UserDao get userDao;
}

5.5 代码生成

运行以下命令生成数据库操作代码:

flutter pub run build_runner build

5.6 应用入口

// lib/main.dart
import 'package:flutter/material.dart';
import 'package:floor/floor.dart';
import 'dart:async';
import 'dart:math';

import 'user.dart';
import 'user_dao.dart';
import 'database.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Floor示例',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late AppDatabase database;
  List<User> users = [];
  bool isDatabaseInitialized = false;

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

  Future<void> _initDatabase() async {
    final db = await $FloorAppDatabase.databaseBuilder('app_database.db').build();
    setState(() {
      database = db;
      isDatabaseInitialized = true;
    });
  }

  Future<void> _addRandomUsers() async {
    if (!isDatabaseInitialized) return;

    final userDao = database.userDao;

    // 创建3个随机用户
    final random = Random();
    List<User> randomUsers = List.generate(3, (index) {
      return User(null, '用户 ${random.nextInt(100)}', random.nextInt(100));
    });

    for (var user in randomUsers) {
      await userDao.insertUser(user);
    }

    // 获取插入后的数据并更新UI
    _getUsers();
  }

  Future<void> _getUsers() async {
    if (!isDatabaseInitialized) return;

    final userDao = database.userDao;
    final allUsers = await userDao.findAllUsers();
    setState(() {
      users = allUsers;
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Floor数据库示例')),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          ElevatedButton(
            onPressed: _addRandomUsers,
            child: Text('添加随机用户'),
          ),
          ElevatedButton(
            onPressed: _getUsers,
            child: Text('显示所有用户'),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: users.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(users[index].name),
                  subtitle: Text('年龄: ${users[index].age}, ID: ${users[index].id}'),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

6. 最佳实践

  • 数据库版本管理:当实体类结构发生变化时,需要更新数据库版本并提供迁移策略
  • 事务处理:对于需要保证原子性的操作,使用事务管理
  • 资源释放:确保在不需要数据库时关闭数据库连接
  • 查询优化:使用索引和优化的查询语句提高性能
  • 代码生成:每次修改实体类或DAO后,记得重新生成代码

7. 总结

Floor是Flutter OpenHarmony应用开发中实现本地数据持久化的强大工具。通过本文的介绍,您应该已经了解了如何:

  1. 搭建开发环境
  2. 通过AtomGit引入Floor和sqflite依赖
  3. 定义实体类、DAO和数据库
  4. 生成数据库操作代码
  5. 执行数据库增删改查操作

Floor的类型安全特性和简洁API设计使其成为Flutter OpenHarmony应用开发中的理想选择,帮助您构建更加可靠和可维护的应用程序。

8. 社区支持

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值