Flutter ORM 主要用于简化数据库操作,常用的有 sqflite 配合手动 SQL、Floor、Drift(原 Moor)等。以下是使用 Drift 的示例,因为它功能强大且类型安全。
1. 添加依赖
在 pubspec.yaml 中:
dependencies:
drift: ^2.13.0
sqlite3_flutter_libs: ^0.5.0
path_provider: ^2.1.1
path: ^1.8.3
dev_dependencies:
drift_dev: ^2.13.0
build_runner: ^2.4.0
2. 创建数据表
定义 Todo 表和 DAO:
// database.dart
import 'package:drift/drift.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
part 'database.g.dart'; // 生成文件
class Todos extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get title => text()();
BoolColumn get completed => boolean().withDefault(const Constant(false))();
}
@DriftDatabase(tables: [Todos])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
@override
int get schemaVersion => 1;
}
LazyDatabase _openConnection() {
return LazyDatabase(() async {
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, 'db.sqlite'));
return NativeDatabase(file);
});
}
3. 生成代码
运行命令生成 database.g.dart:
flutter pub run build_runner build
4. 使用数据库
在 Flutter 中操作数据:
final db = AppDatabase();
// 插入
await db.into(db.todos).insert(TodosCompanion.insert(title: 'Test'));
// 查询
final allTodos = await db.select(db.todos).get();
// 更新
await db.update(db.todos).replace(Todo(id: 1, title: 'Test', completed: true));
// 删除
await db.delete(db.todos).delete(Todo(id: 1));
其他 ORM
- Floor:类似 Room(Android),需注解和代码生成。
- Sqflite:直接写 SQL,更灵活但需手动处理。
提示
- 使用
Stream 监听数据变化(Drift 支持 select(...).watch())。
- 在生产环境中处理数据库迁移。
这样即可高效管理 Flutter 本地数据。