Flutter开发新手求助:如何实现ORM层?恳请提供示例
Flutter项目实现ORM层的实用方案
针对Flutter项目的ORM需求,推荐两个生态中成熟且易用的库:Floor(类似Android Room,上手简单)和Drift(原Moor,灵活性强),以下是具体实现示例:
方案一:使用Floor实现ORM
1. 添加依赖
在pubspec.yaml中添加相关依赖:
dependencies: floor: ^1.4.2 sqflite: ^2.3.0 dev_dependencies: floor_generator: ^1.4.2 build_runner: ^2.4.4
2. 定义实体类
创建user.dart,标记为数据库表:
import 'package:floor/floor.dart'; @entity class User { @primaryKey final int id; final String name; final String email; User(this.id, this.name, this.email); }
3. 创建DAO(数据访问对象)
创建user_dao.dart,定义数据库操作方法:
import 'package:floor/floor.dart'; import 'user.dart'; @dao abstract class UserDao { @Query('SELECT * FROM User') Future<List<User>> getAllUsers(); @Query('SELECT * FROM User WHERE id = :id') Future<User?> getUserById(int id); @insert Future<void> insertUser(User user); @update Future<void> updateUser(User user); @delete Future<void> deleteUser(User user); }
4. 生成数据库类
创建database.dart:
import 'dart:async'; import 'package:floor/floor.dart'; import 'package:sqflite/sqflite.dart' as sqflite; import 'user.dart'; import 'user_dao.dart'; part 'database.g.dart'; // 生成的代码会自动写入此文件 @Database(version: 1, entities: [User]) abstract class AppDatabase extends FloorDatabase { UserDao get userDao; }
运行命令生成数据库代码:
flutter pub run build_runner build
5. 初始化并使用
void main() async { final database = await $FloorAppDatabase.databaseBuilder('app_database.db').build(); final userDao = database.userDao; // 插入用户 await userDao.insertUser(User(1, '张三', 'zhangsan@example.com')); // 获取所有用户 final users = await userDao.getAllUsers(); print(users); // 根据ID查询用户 final targetUser = await userDao.getUserById(1); print(targetUser?.name); }
方案二:使用Drift实现ORM
1. 添加依赖
在pubspec.yaml中添加:
dependencies: drift: ^2.11.0 sqlite3_flutter_libs: ^0.5.16 path_provider: ^2.1.1 path: ^1.8.3 dev_dependencies: drift_dev: ^2.11.0 build_runner: ^2.4.4
2. 定义表与数据库类
创建app_database.dart:
import 'package:drift/drift.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as p; import 'dart:io'; // 定义用户表 class Users extends Table { IntColumn get id => integer().autoIncrement()(); TextColumn get name => text()(); TextColumn get email => text().unique()(); } // 数据库核心类 @DriftDatabase(tables: [Users]) class AppDatabase extends _$AppDatabase { AppDatabase() : super(_openConnection()); @override int get schemaVersion => 1; // 查询所有用户 Future<List<User>> getAllUsers() => select(users).get(); // 根据ID查询用户 Future<User?> getUserById(int id) => select(users)..where((u) => u.id.equals(id)).getSingleOrNull(); // 插入用户 Future<void> insertUser(User user) => into(users).insert(user); // 更新用户 Future<void> updateUser(User user) => update(users).replace(user); // 删除用户 Future<void> deleteUser(User user) => delete(users).delete(user); } // 初始化数据库连接 LazyDatabase _openConnection() { return LazyDatabase(() async { final dbFolder = await getApplicationDocumentsDirectory(); final file = File(p.join(dbFolder.path, 'app_database.db')); return NativeDatabase(file); }); }
运行命令生成代码:
flutter pub run build_runner build
3. 使用示例
void main() async { final db = AppDatabase(); // 插入用户(使用Companion处理可选字段) await db.insertUser(UsersCompanion( name: Value('李四'), email: Value('lisi@example.com'), )); // 获取所有用户 final users = await db.getAllUsers(); print(users); // 更新用户 final user = await db.getUserById(1); if (user != null) { await db.updateUser(user.copyWith(name: '李四更新')); } }
新手注意事项
- 若生成代码时出现冲突,先执行
flutter pub run build_runner clean再重新build - 数据库版本升级时,需处理数据迁移,Floor和Drift均提供了迁移API
- 优先选择维护活跃的库,上述两个库均为Flutter生态中主流的ORM方案
内容的提问来源于stack exchange,提问作者Saniyo Mathew
相关产品推荐
相关产品推荐

