【Flutter】使用 Drift 实现 Flutter 数据持久化

一、前言

你是否渴望成为 Flutter 的专家,掌握更多的技巧和最佳实践?我们有个好消息要告诉你! Flutter 从零到一 基础入门到应用上线全攻略 正在等待你的加入!这个专栏包含了你需要的所有 Flutter 学习资源,包括代码示例和深度解析。专栏内容会持续更新,价格也会随之上涨。现在就加入,享受最优惠的价格!此外,我们还有一个专门的讨论群,你可以点击这里 加入我们的讨论群,与其他 Flutter 学习者一起交流和学习。让我们今天就开始 Flutter 的学习之旅吧!

在开发 Flutter 应用时,我们经常需要处理数据的存储和读取。对于这个问题,Drift 提供了一个优雅的解决方案。Drift 是一个用于 Flutter 和 Dart 的反应式持久性库,它基于 sqlite 构建,允许我们以一种类型安全、易于理解的方式来操作数据库。

在这篇文章中,我们将介绍 Drift 的基础使用,包括如何安装和设置 Drift,如何创建数据库和表,以及如何插入、查询、更新和删除数据。我们还将介绍如何使用事务来保证数据的一致性。

阅读本文后,你将能够掌握以下知识:

  • 了解 Drift 的基本概念和功能
  • 学习如何在 Flutter 项目中安装和设置 Drift
  • 学习如何使用 Drift 创建数据库和表
  • 学习如何使用 Drift 插入、查询、更新和删除数据
  • 学习如何使用 Drift 进行事务操作

这是小雨青年于 2023 年发布在 CSDN 的博客,由于目前采集站侵权行为猖獗,如果你不是在 CSDN 看到本文,麻烦你通过 CSDN 联系我,谢谢你的支持~

在这里插入图片描述

二、版本信息

在开始之前,我们需要确保我们的开发环境满足以下要求:

  • Flutter 版本:3.10.0 或更高
  • Dart SDK 版本:3.0.0 或更高
  • Drift 版本:2.9.0

请确保你的 Flutter 和 Dart SDK 的版本满足以上要求。如果你的版本低于这些要求,你可能需要升级你的开发环境。你可以通过运行 flutter --versiondart --version 来检查你的 Flutter 和 Dart SDK 的版本。

三、Drift 简介

Drift 是一个用于 Flutter 和 Dart 的反应式持久性库,它基于 sqlite 构建。Drift 具有以下特性:

  • 灵活:Drift 允许你用 SQL 和 Dart 编写查询,为两种语言提供流畅的 api。你可以过滤和排序结果,或者使用连接来在多个表上运行查询。你甚至可以使用复杂的 sql 特性,如 WITH 和 WINDOW 子句。
  • 功能丰富:Drift 内置了对事务、模式迁移、复杂过滤器和表达式、批量更新和连接的支持。我们甚至有一个内置的 SQL IDE!
  • 模块化:由于内置了对 daos 和 sql 文件中的导入的支持,Drift 可以帮助你简化数据库代码。
  • 安全:Drift 根据你的表和查询生成类型安全的代码。如果你在查询中犯了错误,Drift 会在编译时找到它,并提供有用和描述性的提示。
  • 快速:尽管 Drift 让你编写强大的查询,但它可以跟上键值存储的性能。Drift 是唯一一个具有内置线程支持的主要持久性库,允许你在隔离中运行数据库代码,无需任何额外的努力。
  • 反应式:将任何 sql 查询转化为自动更新的流!这包括跨多个表的复杂查询。
  • 跨平台支持:Drift 在 Android、iOS、macOS、Windows、Linux 和 web 上都可以工作。这个模板是一个在所有平台上都可以工作的 Flutter todo 应用。
  • 经过战斗测试并准备好生产:Drift 是稳定的,经过了大量的单元测试和集成测试。它为生产 Flutter 应用提供了动力。

四、如何安装和设置 Drift

要在 Flutter 项目中使用 Drift,我们首先需要将它添加到我们的项目依赖中。打开你的 pubspec.yaml 文件,找到 dependencies 部分,添加以下代码:

dependencies:
  flutter:
    sdk: flutter

  drift: ^2.9.0

然后,运行 flutter packages get 命令来获取包。

接下来,我们需要创建一个 Dart 文件来定义我们的数据库。在这个文件中,我们将定义我们的表和数据访问对象(DAO)。

import 'package:drift/drift.dart';

part 'my_database.g.dart';

class Tasks extends Table {
    
    
  IntColumn get id => integer().autoIncrement()();
  TextColumn get name => text().withLength(min: 1, max: 50)();
  BoolColumn get completed => boolean().withDefault(Constant(false))();
}

(tables: [Tasks])
class MyDatabase extends _$MyDatabase {
    
    
  MyDatabase(QueryExecutor e) : super(e);

  
  int get schemaVersion => 1;
}

在这个示例中,我们定义了一个 Tasks 表,它有三个字段:idnamecompleted。然后,我们定义了一个 MyDatabase 类,它包含了我们的 Tasks 表。

五、基础使用

1. 创建数据库和表

在上一章节中,我们已经在 MyDatabase 类中定义了 Tasks 表。现在,我们需要创建一个数据库实例,并使用这个实例来操作我们的 Tasks 表。

首先,我们需要创建一个 QueryExecutorQueryExecutor 是 Drift 用来与 SQLite 数据库交互的接口。在 Android 和 iOS 上,我们通常使用 FlutterQueryExecutor,它会在应用的沙盒目录中创建一个 SQLite 数据库。

final executor = FlutterQueryExecutor.inDatabaseFolder(
  path: 'db.sqlite',
  logStatements: true,
);

然后,我们使用这个 QueryExecutor 来创建 MyDatabase 的实例:

final db = MyDatabase(executor);

现在,我们就可以使用 db 来操作我们的 Tasks 表了。

2. 插入、查询、更新和删除数据

在 Drift 中,我们可以使用 into 方法来插入数据,使用 watchget 方法来查询数据,使用 update 方法来更新数据,使用 delete 方法来删除数据。

// 插入数据
final task = TasksCompanion(
  name: Value('Learn Drift'),
  completed: Value(false),
);
await into(tasks).insert(task);

// 查询数据
final allTasks = await select(tasks).get();

// 更新数据
final completedTask = TasksCompanion(
  id: Value(1),
  completed: Value(true),
);
await update(tasks).replace(completedTask);

// 删除数据
await delete(tasks).delete(completedTask);

在这些示例中,我们使用 TasksCompanion 来创建一个新的任务,然后使用 into(tasks).insert(task) 来插入这个任务。我们使用 select(tasks).get() 来获取所有的任务。我们使用 update(tasks).replace(completedTask) 来更新一个任务。我们使用 delete(tasks).delete(completedTask) 来删除一个任务。

3. 使用事务

在数据库操作中,事务是一个非常重要的概念。事务可以确保一系列操作要么全部成功,要么全部失败,这样可以保证数据的一致性。

在 Drift 中,我们可以使用 transaction 方法来执行一个事务。以下是一个示例:

await db.transaction(() async {
    
    
  // 插入一个新的任务
  final task = TasksCompanion(
    name: Value('Learn Drift'),
    completed: Value(false),
  );
  await into(tasks).insert(task);

  // 更新一个任务
  final completedTask = TasksCompanion(
    id: Value(1),
    completed: Value(true),
  );
  await update(tasks).replace(completedTask);
});

我们在一个事务中插入了一个新的任务,并更新了一个任务。如果这两个操作中的任何一个失败,那么这两个操作都不会被执行。

六、总结

在这篇文章中,我们介绍了如何在 Flutter 项目中使用 Drift 进行数据持久化。我们学习了如何安装和设置 Drift,如何创建数据库和表,如何插入、查询、更新和删除数据,以及如何使用事务。

希望这篇文章能帮助你理解和使用 Drift。如果你有任何问题或者建议,欢迎在评论区留言。

这是小雨青年于 2023 年发布在 CSDN 的博客,由于目前采集站侵权行为猖獗,如果你不是在 CSDN 看到本文,麻烦你通过 CSDN 联系我,谢谢你的支持~

在下一篇文章中,我们将深入探讨 Drift 的高级特性,包括 SQL 和 Dart 查询、复杂的 SQL 特性、模式迁移、复杂过滤器和表达式、批量更新和连接、类型安全的代码生成、性能优化和线程支持、反应式编程和自动更新的流。敬请期待!

你是否对 Flutter 感到好奇,想要深入学习?那么,Flutter 从零到一 基础入门到应用上线全攻略 将是你的最佳选择!在这里,你可以找到全面的 Flutter 学习资源,包括代码示例和深度解析。你是否想知道如何用 Flutter 构建应用?所有的答案都在我们的专栏里!别再犹豫了,专栏内容会持续更新,价格也会随之上涨。现在就加入,享受最优惠的价格!让我们一起在 Flutter 的世界中探索吧!想了解更多?点击这里查看 Flutter Developer 101 入门小册 专栏指引。此外,我们还有一个专门的讨论群,你可以点击这里 加入我们的讨论群,与其他 Flutter 学习者一起交流和学习。

猜你喜欢

转载自blog.csdn.net/diandianxiyu/article/details/131605795