flutter drift如何使用
我在Flutter项目中尝试使用Drift作为数据库解决方案,但遇到了一些问题不太明白:
- 如何正确安装和配置Drift依赖?官方文档提到的
drift_dev和build_runner具体要怎么使用? - 定义数据表时,
@DataClassName注解和Table类的写法有什么注意事项? - 复杂查询(如多表联查或条件筛选)在Drift中如何实现?是否有更简洁的写法?
- 数据库升级迁移时,版本管理的具体步骤是什么?比如新增字段该怎么操作?
- 能否提供一个完整的CRUD操作示例?尤其是事务处理的部分不太清楚。
求有经验的大佬指教!
2 回复
Flutter Drift 是 SQLite 的响应式封装库,使用步骤:
- 添加依赖:在
pubspec.yaml中添加drift和drift_dev。 - 定义数据表:使用 Dart 类或
.drift文件创建表结构。 - 生成代码:运行
flutter packages pub run build_runner build。 - 数据库操作:通过生成的 DAO 类进行增删改查。
- 响应式查询:使用
Stream监听数据变化。
示例:查询所有用户 select(users).watch() 返回流数据。
更多关于flutter drift如何使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
Flutter Drift(原Moor)是一个功能强大的Flutter数据库库,基于SQLite构建,提供类型安全和响应式查询。以下是基本使用方法:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
drift: ^2.8.0
sqlite3_flutter_libs: ^0.5.0
path_provider: ^2.0.0
path: ^1.8.0
dev_dependencies:
drift_dev: ^2.8.0
build_runner: ^2.3.0
2. 定义数据表
import 'package:drift/drift.dart';
part 'database.g.dart'; // 生成的文件
class Todos extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get title => text().withLength(min: 1, max: 50)();
BoolColumn get completed => boolean().withDefault(const Constant(false))();
}
@DriftDatabase(tables: [Todos])
class MyDatabase extends _$MyDatabase {
MyDatabase() : 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. 生成代码
运行命令生成数据库代码:
flutter packages pub run build_runner build
4. 基本操作
final db = MyDatabase();
// 插入
await db.into(db.todos).insert(
TodosCompanion.insert(title: 'Learn Drift'),
);
// 查询
final allTodos = await db.select(db.todos).get();
// 条件查询
final incomplete = await (db.select(db.todos)
..where((t) => t.completed.equals(false))
).get();
// 更新
await (db.update(db.todos)
..where((t) => t.id.equals(1))
).write(const TodosCompanion(completed: Value(true)));
// 删除
await (db.delete(db.todos)
..where((t) => t.id.equals(1))
).go();
5. 响应式查询
Stream<List<Todo>> watchIncompleteTodos() {
return (db.select(db.todos)
..where((t) => t.completed.equals(false))
).watch();
}
6. 事务处理
await db.transaction(() async {
await db.into(db.todos).insert(...);
await db.update(db.todos).write(...);
});
注意事项:
- 记得在
pubspec.yaml中正确配置依赖 - 每次修改表结构后需要更新
schemaVersion - 复杂的查询可以使用自定义 SQL
- 使用
watch()可以创建响应式查询流
这样就完成了 Drift 的基本使用。记得在应用退出时关闭数据库连接:
@override
void dispose() {
db.close();
super.dispose();
}

