You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:05:27