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

news2024/9/21 22:59:18

文章目录

    • 一、前言
    • 二、版本信息
    • 三、Drift 简介
    • 四、如何安装和设置 Drift
    • 五、基础使用
      • 1. 创建数据库和表
      • 2. 插入、查询、更新和删除数据
      • 3. 使用事务
    • 六、总结

一、前言

你是否渴望成为 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 学习者一起交流和学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/729249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue3】学习笔记--组件通信方式

学习vue3总是绕不开vue2 vue2组件通信方式总结: 1、props:可以实现父子组件,子父组件,甚至兄弟组件通信 2、自定义事件:实现子父组件通信 3、全局事件总线$bus:可以实现任意组件通信 4、pubsub:发布订阅模…

目标检测常用的评价指标

目标检测常用的评价指标 1 IoU(Intersection over Union)2 GIoU(Generalized IoU)3 DIoU(Distance-IoU)4 CIoU(Complete-IoU)5 EIoU(Efficient-IoU)6 SIoU7 W…

爬虫入门07——requests中携带cookie信息

爬虫入门07——requests中携带cookie信息 对于需要登陆的网站如果不携带cookie是无法获取我们所需内容的就以查看我在CSDN中的订单为例,在登陆后可以查看到订单信息 而当我们使用Python代码发出请求时,是不携带cookie,因此无法拿到订单相关信…

Flink的状态是否支持任务间共享

背景: 在日常编写代码的过程中,我们经常会在方法内部new很多的其他类对象来进行编码工作,那么对于这种情况怎么让new出来的对象是一个我们特意创建出来的一个mock实例,从而让我们能完全控制new出来的对象的所有行为呢&#xff1f…

【雕爷学编程】Arduino动手做(154)---AFMotor电机扩展板模块3

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

数模混合项目:模拟跨数字走线注意事项

数模混合项目中,模拟在数字上走线是常有的事,这里需要注意几个点: 1.模拟电源在数字上走线影响不大,但尽量走top metal和AP层。 2.模拟高频线,尤其是时钟,尽量不要在数字上走线,非要走,最好下…

数据总线学习

为啥要数据总线 使用服务化方式发布,业务端和中间件完全解耦合。一处生产,处处消费设计理念。提供用户可定制的托管化通用消费方案(如同步mysql到缓存,同步mysql到es,消费mysql到大数据等托管服务) 特性 …

python configparser模块常用方法以及常见报错处理

configparser 是 Python 中一个用于处理配置文件的标准库,可以帮助你生成、读取和修改配置文件的内容 1. 生成配置文件 import configparser# 创建一个配置文件对象 config configparser.ConfigParser()# 添加配置项和值 config[Section1] {key1: value1, key2: …

java 科学计算库 Smile

官网 https://haifengl.github.io/ github https://haifengl.github.io/ 简介 统计机器智能和学习引擎,或者简称 Smile,是一个有前途的现代机器学习系统,在某些方面类似于 Python 的 scikit-learn。它是用 Java 开发的,也提供…

私域账号防范手册

微信为什么要养号吗?为什么会被封?是什么原理,怎么解封,这些你的了解吗? 来看看这篇文章,这些都能给你解答。

向日葵远程命令执行漏洞(CNVD-2022-10270) 漏洞复现

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 漏洞描述02 影响范围03 利用方式05 实战案例06 修复方案 01 漏洞描述 向日葵远程控制是一款面向企业和专业人员的远程pc管理和控制的服务软件。可以在任何有网络的情况下,轻松访问并控制…

Linux命令之nc命令

一、命令简介 nc是netcat的简写,是一个功能强大的网络工具,有着网络界的瑞士军刀美誉。nc命令在linux系统中实际命令是ncat,nc是软连接到ncat。nc命令的主要作用如下: 实现任意TCP/UDP端口的侦听,nc可以作为server以T…

vue3中的包装响应式数据ref、reactive、toRef、toRefs

一、ref Vue 3中拥有一个新的特性叫做ref,它是一个函数,用于包装响应式数据。与Vue 2的data选项不同,ref可以在普通JavaScript中使用,而不仅仅是在Vue组件中。ref可以将普通的JavaScript数据变成响应式的,这意味着当被…

Python接口自动化测试post请求和get请求,获取请求返回值

引言 我们在做python接口自动化测试时,接口的请求方法有get,post等;get和post请求传参,和获取接口响应数据的方法; 请求接口为Post时,传参方法 我们在使用python中requests库做接口测试时,在做post接口测试…

Go语言-数组和切片有什么异同?

slice 的底层数据是数组,slice 是对数组的封装,它描述一个数组的片段。两者都可以通过下标来访问单个元素。 数组是定长的,长度定义好之后,不能再更改。在 Go 中,数组是不常见的,因为其长度是类型的一部分…

2023年第一届证券基金行业先进计算峰会在沪成功召开

2023年7月7日,在中国计算机学会集成电路设计专委会、中国通信学会金融科技发展促进中心、中国电子工业标准化技术协会新一代计算标准工作委员会和证券基金信息技术创新联盟WG1工作组的指导下,由中科驭数主办的2023年第一届证券基金行业先进计算峰会在上海…

以太网电子产品高低温循环测试

参考标准:《GB/T 2423.22-2012 环境试验 第2部分:试验方法 试验N:温度变化》:试验用来确定元器件、设备或其他产品耐受环境温度快速变化的能力。 1、测试影响因素 温度变化试验用来确定一次或连续多次的温度变化对试验样品的影响…

linux报错 /bin/bash^M:解释器错误:没有那个文件或目录

在Linux中运行脚本时,会出现linux报错 /bin/bash^M:解释器错误:没有那个文件或目录。这是因为我们将在Windows下编写的脚本拷贝到Linux环境中运行时会出现运行不了的情况。主要还是Windows的换行符为\r\n,而Linux环境中的换行符号为\n。 解决方法有:  …

Java安全——基于密码的加密

Java安全 基于密码的加密 基于密码加密和SSL加密的区别 密码加密可以数据和密码分离传输SSL只限于在套接字空间传输的数据进行加密 SSL和密码加密 密码加密是指通过算法将原始信息转换成密文,只有知道相应密钥的人才能解密。Java中常用的密码加密算法包括MD5、SHA、…

Buffer Overflow缓冲区溢出和保护措施

缓冲区溢出是指当数据写入某个缓冲区(buffer)时,超出了为该缓冲区分配的内存空间,从而导致覆盖了相邻内存区域的情况。这种现象可能导致程序崩溃、数据损坏,甚至引发安全漏洞,允许攻击者利用这一漏洞执行恶…