Flutter如何使用drift数据库

我在Flutter项目中使用drift数据库时遇到一些问题,想请教大家:

  1. 如何在Flutter中正确集成drift数据库?需要添加哪些依赖?
  2. 创建数据库表时应该注意哪些事项?能否提供一个完整的表定义示例?
  3. 如何进行基本的CRUD操作?特别是复杂的查询该怎么写?
  4. 数据库升级迁移要怎么处理?现有的数据会不会丢失?
  5. 在调试时有什么好的方法可以查看数据库内容? 希望能得到详细的使用指导,谢谢!
2 回复

在Flutter中使用drift数据库,需先添加依赖:driftdrift_dev。定义数据表和查询,通过@DriftDatabase注解标记数据库类。使用FlutterQueryExecutor连接数据库,执行增删改查操作。

更多关于Flutter如何使用drift数据库的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中使用 Drift(原名 Moor)数据库的步骤如下:

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. 创建数据表

定义表结构(例如 todos 表):

import 'package:drift/drift.dart';

class Todos extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get title => text()();
  BoolColumn get completed => boolean().withDefault(const Constant(false))();
}

3. 创建数据库类

编写数据库连接和表管理:

import 'dart:io';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;

part 'database.g.dart'; // 生成文件

@DriftDatabase(tables: [Todos])
class MyDatabase extends _$MyDatabase {
  MyDatabase() : super(_openConnection());

  @override
  int get schemaVersion => 1;

  // 查询示例:获取所有待办事项
  Future<List<Todo>> get allTodoItems => select(todos).get();
}

LazyDatabase _openConnection() {
  return LazyDatabase(() async {
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'db.sqlite'));
    return NativeDatabase(file);
  });
}

4. 生成代码

运行命令生成数据库代码:

flutter pub run build_runner build

5. 使用数据库

在 Flutter 中操作数据:

final db = MyDatabase();

// 插入数据
await db.into(db.todos).insert(TodosCompanion(
  title: Value('学习 Drift'),
));

// 查询数据
final allTodos = await db.allTodoItems;

// 更新数据
await db.update(db.todos).replace(
  Todo(id: 1, title: '更新后的标题', completed: true),
);

// 删除数据
await db.delete(db.todos).delete();

6. 关闭数据库

在应用退出时关闭连接:

@override
void dispose() {
  db.close();
  super.dispose();
}

注意事项

  • 修改表结构后需更新 schemaVersion 并实现迁移
  • 使用 watch() 可监听查询变化并自动更新 UI
  • 复杂查询可通过自定义 DAO 实现

通过以上步骤即可在 Flutter 中集成 Drift 数据库实现本地数据持久化。

回到顶部