
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应用开发中实现本地数据持久化的强大工具。通过本文的介绍,您应该已经了解了如何:
- 搭建开发环境
- 通过AtomGit引入Floor和sqflite依赖
- 定义实体类、DAO和数据库
- 生成数据库操作代码
- 执行数据库增删改查操作
Floor的类型安全特性和简洁API设计使其成为Flutter OpenHarmony应用开发中的理想选择,帮助您构建更加可靠和可维护的应用程序。
8. 社区支持
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.youkuaiyun.com
2777

被折叠的 条评论
为什么被折叠?



