Flutter数据库ORM插件floor的使用
Flutter数据库ORM插件floor的使用
概述
Floor是一个为Flutter应用程序提供的SQLite抽象库,灵感来自Android的Room持久化库。它提供了内存对象和数据库行之间的自动映射,同时仍然允许通过使用SQL对数据库进行完全控制。因此,有必要了解SQL和SQLite,以便充分利用Floor的潜力。
Floor特性
- 空安全(null-safe)
- 类型安全(typesafe)
- 响应式(reactive)
- 轻量级(lightweight)
- 以SQL为中心(SQL centric)
- 没有隐藏的魔法(no hidden magic)
- 没有隐藏的成本(no hidden costs)
- 支持iOS、Android、Linux、macOS、Windows
图片
开始使用
1. 设置依赖项
在pubspec.yaml
中添加运行时依赖floor
以及生成器floor_generator
。第三个依赖是build_runner
,它必须作为开发依赖项包含进来,就像生成器一样。
dependencies:
flutter:
sdk: flutter
floor: ^1.4.2
dev_dependencies:
floor_generator: ^1.4.2
build_runner: ^2.1.2
2. 创建实体
实体将表示数据库表以及业务对象的框架。@entity
标记类为持久类。需要在表中添加主键,可以通过在int
属性上添加@primaryKey
注解来实现。
// entity/person.dart
import 'package:floor/floor.dart';
@Entity // 标记类为实体
class Person {
@PrimaryKey(autoGenerate: true) // 添加主键
final int id;
final String name;
Person(this.id, this.name);
}
3. 创建DAO(数据访问对象)
这个组件负责管理对底层SQLite数据库的访问。抽象类包含查询数据库的方法签名,这些方法必须返回Future
或Stream
。
// dao/person_dao.dart
import 'package:floor/floor.dart';
import 'entity/person.dart';
@dao // 标记类为DAO
abstract class PersonDao {
@Query('SELECT * FROM Person') // 查询所有Person
Future<List<Person>> findAllPeople();
@Query('SELECT name FROM Person') // 查询所有Person的名字
Stream<List<String>> findAllPeopleName();
@Query('SELECT * FROM Person WHERE id = :id') // 根据ID查询Person
Stream<Person?> findPersonById(int id);
@Insert(onConflict: OnConflictStrategy.replace) // 插入Person
Future<void> insertPerson(Person person);
}
4. 创建数据库
数据库必须是一个扩展FloorDatabase
的抽象类。此外,需要在类的签名中添加@Database()
。确保将创建的实体添加到@Database
注解的entities
属性中。为了使生成的代码工作,还需要添加列出的导入。
确保在此文件的导入下面添加part 'database.g.dart';
。需要注意的是,“database”必须与数据库定义文件名交换。在这个例子中,文件名为database.dart
。
// database.dart
// 必要的包导入
import 'dart:async';
import 'package:floor/floor.dart';
import 'package:sqflite/sqflite.dart' as sqflite;
import 'dao/person_dao.dart';
import 'entity/person.dart';
part 'database.g.dart'; // 生成的代码将在这里
@Database(version: 1, entities: [Person]) // 定义数据库版本和实体
abstract class AppDatabase extends FloorDatabase {
PersonDao get personDao; // 获取DAO实例
}
5. 运行代码生成器
使用flutter packages pub run build_runner build
运行生成器。若要在文件更改时自动运行,请使用flutter packages pub run build_runner watch
。
6. 使用生成的代码
为了获取数据库实例,使用生成的$FloorAppDatabase
类,该类允许访问数据库构建器。名称由$Floor
和数据库类名组成。传递给databaseBuilder()
的字符串将是数据库文件名。初始化数据库时,调用build()
并确保await
结果。
为了检索PersonDao
实例,只需在数据库实例上调用persoDao
getter即可。其功能可以如以下片段所示使用。
final database = await $FloorAppDatabase.databaseBuilder('app_database.db').build(); // 构建数据库
final personDao = database.personDao;
final person = Person(1, 'Frank');
await personDao.insertPerson(person); // 插入Person
final result = await personDao.findPersonById(1); // 根据ID查找Person
完整示例Demo
以下是完整的示例代码,包括设置依赖项、创建实体、DAO、数据库,并使用生成的代码:
1. pubspec.yaml
dependencies:
flutter:
sdk: flutter
floor: ^1.4.2
dev_dependencies:
floor_generator: ^1.4.2
build_runner: ^2.1.2
2. entity/person.dart
import 'package:floor/floor.dart';
@Entity // 标记类为实体
class Person {
@PrimaryKey(autoGenerate: true) // 添加主键
final int id;
final String name;
Person(this.id, this.name);
}
3. dao/person_dao.dart
import 'package:floor/floor.dart';
import 'entity/person.dart';
@dao // 标记类为DAO
abstract class PersonDao {
@Query('SELECT * FROM Person') // 查询所有Person
Future<List<Person>> findAllPeople();
@Query('SELECT name FROM Person') // 查询所有Person的名字
Stream<List<String>> findAllPeopleName();
@Query('SELECT * FROM Person WHERE id = :id') // 根据ID查询Person
Stream<Person?> findPersonById(int id);
@Insert(onConflict: OnConflictStrategy.replace) // 插入Person
Future<void> insertPerson(Person person);
}
4. database.dart
// 必要的包导入
import 'dart:async';
import 'package:floor/floor.dart';
import 'package:sqflite/sqflite.dart' as sqflite;
import 'dao/person_dao.dart';
import 'entity/person.dart';
part 'database.g.dart'; // 生成的代码将在这里
@Database(version: 1, entities: [Person]) // 定义数据库版本和实体
abstract class AppDatabase extends FloorDatabase {
PersonDao get personDao; // 获取DAO实例
}
5. 运行生成器
在终端中运行以下命令:
flutter packages pub run build_runner build
6. 使用生成的代码
void main() async {
final database = await $FloorAppDatabase.databaseBuilder('app_database.db').build(); // 构建数据库
final personDao = database.personDao;
final person = Person(1, 'Frank');
await personDao.insertPerson(person); // 插入Person
final result = await personDao.findPersonById(1); // 根据ID查找Person
print(result?.name); // 输出找到的Person的名字
}
更多关于Flutter数据库ORM插件floor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库ORM插件floor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用Floor——一个流行的ORM(对象关系映射)插件——的示例。Floor使得与SQLite数据库的交互变得更加简单和直观。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加Floor的依赖:
dependencies:
flutter:
sdk: flutter
floor: ^x.y.z # 请替换为最新版本号
dev_dependencies:
build_runner: ^x.y.z # 请替换为最新版本号
floor_generator: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装这些依赖。
2. 创建数据模型
定义一个数据模型,并使用Floor的注解来指定数据库表的列和主键。
import 'package:floor/floor.dart';
@Entity(tableName: 'users')
data class User(
@PrimaryKey(autoGenerate: true) var id: Int,
@ColumnInfo(name: 'name') var name: String,
@ColumnInfo(name: 'age') var age: Int,
)
3. 创建DAO接口
DAO(数据访问对象)接口用于定义数据库操作。
import 'package:floor/floor.dart';
import 'user_entity.dart'; // 导入你的数据模型文件
@Dao
interface UserDao {
@Insert(onConflict: ConflictStrategy.REPLACE)
Future<void> insertUser(User user);
@Update
Future<void> updateUser(User user);
@Delete
Future<void> deleteUser(User user);
@Query('SELECT * FROM users')
Future<List<User>> getAllUsers();
@Query('SELECT * FROM users WHERE id = :userId')
Stream<User?> findUserById(int userId);
}
4. 配置Floor数据库
创建一个数据库配置类,并使用@Database
注解。
import 'package:floor/floor.dart';
import 'user_dao.dart'; // 导入你的DAO接口文件
import 'user_entity.dart'; // 导入你的数据模型文件
@Database(entities: [User], daos: [UserDao])
abstract class AppDatabase extends FloorDatabase {
UserDao getUserDao();
}
5. 初始化数据库
在你的应用中初始化Floor数据库。
import 'package:flutter/material.dart';
import 'package:floor/floor.dart';
import 'app_database.dart'; // 导入你的数据库配置类文件
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final database = await $FloorDatabase.databaseBuilder('app_database.db')
.build();
runApp(MyApp(database.getUserDao()));
}
class MyApp extends StatelessWidget {
final UserDao userDao;
MyApp(this.userDao);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Floor Example')),
body: Center(child: Text('Hello, Floor!')),
),
);
}
}
注意:在实际项目中,你可能需要调整数据库初始化部分的代码,以适应你的应用结构和生命周期管理。
6. 使用生成的代码
运行flutter pub run build_runner build
来生成Floor需要的代码。这会在你的项目中生成一个$FloorDatabase
类,该类包含了数据库的实现。
7. 在应用中使用数据库
现在你可以在你的应用中通过userDao
实例来执行数据库操作了。例如:
void insertNewUser(UserDao userDao) async {
final newUser = User(name: 'John Doe', age: 30);
await userDao.insertUser(newUser);
}
这个示例展示了如何在Flutter项目中使用Floor插件来简化SQLite数据库的交互。记得根据你的实际需求调整代码。