flutter drift如何使用

我在Flutter项目中尝试使用Drift作为数据库解决方案,但遇到了一些问题不太明白:

  1. 如何正确安装和配置Drift依赖?官方文档提到的drift_devbuild_runner具体要怎么使用?
  2. 定义数据表时,@DataClassName注解和Table类的写法有什么注意事项?
  3. 复杂查询(如多表联查或条件筛选)在Drift中如何实现?是否有更简洁的写法?
  4. 数据库升级迁移时,版本管理的具体步骤是什么?比如新增字段该怎么操作?
  5. 能否提供一个完整的CRUD操作示例?尤其是事务处理的部分不太清楚。

求有经验的大佬指教!

2 回复

Flutter Drift 是 SQLite 的响应式封装库,使用步骤:

  1. 添加依赖:在 pubspec.yaml 中添加 driftdrift_dev
  2. 定义数据表:使用 Dart 类或 .drift 文件创建表结构。
  3. 生成代码:运行 flutter packages pub run build_runner build
  4. 数据库操作:通过生成的 DAO 类进行增删改查。
  5. 响应式查询:使用 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();
}
回到顶部