Flutter——数据库Drift开发详细教程(六)
目录
- 1.视图
- 2.视图中列的可空性
- 3.DAO
- 4.流查询
- 5.高级用途
- 6.注意事项
1.视图
也可以将SQL 视图定义 为 Dart 类。为此,请编写一个抽象类来扩展View。此示例声明了一个视图,用于读取示例中架构中某个类别中添加的待办事项数量:
abstract class CategoryTodoCount extends View {// Getters define the tables that this view is reading from.Todos get todos;Categories get categories;// Custom expressions can be given a name by defining them as a getter:.Expression<int> get itemCount => todos.id.count(); Query as() =>// Views can select columns defined as expression getters on the class, or// they can reference columns from other tables.select([categories.description, itemCount]).from(categories).join([innerJoin(todos, todos.category.equalsExp(categories.id))]);
}
在 Dart 视图中,使用
- 抽象 getter 来声明您将从中读取的表(例如TodosTable get todos)。
- Expressiongetter 添加列:(例如itemCount => todos.id.count())。
- as用于定义支持视图的 select 语句的重写方法。 中引用的列select可能指两种类型的列:
- 在视图本身上定义的列(itemCount如上例所示)。
- 在引用表上定义的列(如categories.description示例中所示)。对于这些引用,
表中列定义中使用的类型转换器等高级漂移功能也会应用于视图的列。
当被选中时,两种类型的列都将添加到视图的数据类中。
最后,需要通过将视图包含在参数中来将其添加到数据库或访问器中 views:
(tables: [Todos, Categories], views: [CategoryTodoCount])
class MyDatabase extends _$MyDatabase {
2.视图中列的可空性
对于 Dart 定义的视图,定义为Expressiongetter 的 表达式始终可空。此行为与TypedResult.read(用于从包含自定义列的复杂 select 语句中读取结果的方法)匹配。
如果引用的列可为空,或者所选表不是来自内连接(因为null在这种情况下整个表可能都是内连接),则引用另一个表的列的列可为空。
从上面的例子来看,
- 该itemCount列可为空,因为它被定义为复杂 Expression
- description引用 的列不可categories.description为空。这是因为它引用了categories,即视图
select 语句的主表。
3.DAO
当你有大量查询时,将它们全部放入一个类中可能会变得繁琐。你可以通过将一些查询提取到主数据库类中可用的类中来避免这种情况。考虑以下代码:
part '../Dart API/todos_dao.g.dart';// the _TodosDaoMixin will be created by drift. It contains all the necessary
// fields for the tables. The <MyDatabase> type annotation is the database class
// that should use this dao.
(tables: [Todos])
class TodosDao extends DatabaseAccessor<MyDatabase> with _$TodosDaoMixin {// this constructor is required so that the main database can create an instance// of this object.TodosDao(MyDatabase db) : super(db);Stream<List<TodoEntry>> todosInCategory(Category category) {if (category == null) {return (select(todos)..where((t) => isNull(t.category))).watch();} else {return (select(todos)..where((t) => t.category.equals(category.id))).watch();}}
}
如果我们现在将类上的注释更改MyDatabase为**@DriftDatabase(tables: [Todos, Categories], daos: [TodosDao])** 并重新运行代码生成,todosDao则可以使用生成的 getter 来访问该 dao 的实例。
4.流查询
漂移的核心特性是每个查询都可以转换为自动更新流。无论查询返回单行还是多行,无论查询是从单个表读取还是连接多个表,这都能正常工作。
基础知识¶
在drift中,可运行的查询由接口表示Selectable,该接口具有以下方法:
- Future<List> get():运行一次查询,返回所有行。
- Future getSingle():运行查询一次,断言它产生返回的一行。
- Future<T?> getSingleOrNull():类似getSingle(),但允许返回null空结果集。
并且每个方法都有一个匹配的**watch()**返回流的方法:
- Stream<List> watch():监视查询,返回所有行。
- Stream watchSingle():监视查询,断言每次运行查询时都会报告一行。
- Stream<T?> watchSingleOrNull():类似watchSingle(),但返回空结果集null。
用于构建查询的所有漂移 API 都会返回一个Selectable可以监视的内容:
Selectable<TodoItem> allItemsAfter(DateTime min) {return select(todoItems)..where((row) => row.createdAt.isBiggerThanValue(min));
}
无论使用哪种方法,都可以使用 创建流allItemsAfter(value).watch()。由于Stream是 Dart 中的常见构建块,因此大多数框架都可以使用它们:
- 在 Flutter 中,您可以使用 以声明方式监听流StreamBuilder。
- Riverpod 可以使用 来包装流。示例应用StreamProvider中也使用了此技术。
所有漂移流在监听之后都会发出最新的结果(因此即使表从未改变,您也会收到快照,而不必合并get()和watch())。
5.高级用途
除了监听查询之外,您还可以直接监听表上的更新事件:
Future<void> listenForUpdates() async {final stream = tableUpdates(TableUpdateQuery.onTable(todoItems,limitUpdateKind: UpdateKind.update,));await for (final event in stream) {print('Update on todos table: $event');}
}
请注意,整个查询流功能都是以漂移方式实现的,因此流更新是一种启发式方法,可能会比必要的更频繁地触发。您也可以手动将表标记为已更新:
void markUpdated() {notifyUpdates({TableUpdate.onTable(todoItems, kind: UpdateKind.insert)});
}
6.注意事项
虽然流对于自动获取您正在运行的任何查询的更新非常有用,但了解其功能和局限性至关重要。流查询在漂移中以启发式方法实现:对于每个活动流,漂移会跟踪其正在监听的表(该信息可从查询构建器获取)。每当通过漂移 API 进行插入、更新或删除操作时,相关查询都会重新安排并再次运行。
这意味着:
- 数据库的其他用途(例如原生 SQLite 客户端)不会触发流查询更新。您可以手动注入更新作为解决方法。
- 流查询的更新频率通常会超出其应有的水平,因为我们无法仅筛选特定行的更新。这通常不是问题,但需要注意。流查询通常应该返回相对较少的行,并且执行时的计算开销不应过大。
相关文章:
Flutter——数据库Drift开发详细教程(六)
目录 1.视图2.视图中列的可空性3.DAO4.流查询5.高级用途6.注意事项 1.视图 也可以将SQL 视图定义 为 Dart 类。为此,请编写一个抽象类来扩展View。此示例声明了一个视图,用于读取示例中架构中某个类别中添加的待办事项数量: abstract class C…...
PCIe数据采集系统
PCIe数据采集系统 一、模块功能划分与职责 1. 时钟管理模块 (clock_manager) 核心功能: 生成系统所需的多时钟信号(100MHz 系统时钟、125MHz PCIe 时钟、200MHz DDR3 时钟)。 关键接口: 输入:系统主时钟 sys_clk、P…...
mac docker弹窗提示Docker 启动没有响应
一、原因分析 这台笔记电脑是Mac M3操作系统,安装Docker之后,Docker应用程序一直启动不起来。 二、解决办法 sudo rm /Library/PrivilegedHelperTools/com.docker.vmnetd sudo cp /Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd /Library/Pri…...
TVS管用万用表测量方法详解(含二极管档使用指南)
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 TVS管(瞬态抑制二极管)是一种用于保护电路免受瞬态高电压冲击的半导体器件。其核心功能是通过快速导通将过压钳位在安全范围内。本文将重点介绍如何用万用表测量…...
当下流行的智能体通信协议:MCP、A2A、ANP 分别是什么?
在当前人工智能(AI)智能体生态系统中,智能体之间的有效沟通至关重要。为了让AI智能体能够高效、安全地协同工作,业界提出了多种通信协议。其中,MCP、A2A 和 ANP 代表了三个关键层级的通信协议,各自应对不同…...
中国近代史2
甲午中日战争(1894-1895) 1.开始的标志:丰岛海战 2.进程 平壤之战:清军统帅叶志超不战而降,回民将领左宝贵以身殉职 黄海海战(大东沟海战):北洋水师黄海遭遇日本舰队,水…...
Ubnutu ADB 无法识别设备的解决方法
1. 正确安装adb 下载地址 2. 检查 Linux 是否识别设备 lsusb通过上述指令,分别查询插入、断开设备的usb设备表,如下所示: # 插入设备 adbc:~$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 011:…...
基于策略的强化学习方法之近端策略优化(PPO)深度解析
PPO(Proximal Policy Optimization)是一种基于策略梯度的强化学习算法,旨在通过限制策略更新幅度来提升训练稳定性。传统策略梯度方法(如REINFORCE)直接优化策略参数,但易因更新步长过大导致性能震荡或崩溃…...
前端图形渲染 html+css、canvas、svg和webgl绘制详解,各个应用场景及其区别
在前端开发中,HTMLCSS、Canvas、SVG 和 WebGL 是实现图形渲染的四种常见技术。它们各自具有不同的特点和适用场景。以下是对这四种技术的详细解析: 1. HTML CSS 特点: 主要用于构建网页的结构和样式。通过 CSS 可以实现简单的图形效果&am…...
《Navicat之外的新选择:实测支持国产数据库的SQLynx核心功能解析》
数据库工具生态的新变量 在数据库管理工具领域,Navicat长期占据开发者心智。但随着国产数据库崛起和技术信创需求,开发者对工具的兼容性、轻量化和本土化适配提出了更高要求。近期体验了一款名为SQLynx的国产数据库管理工具(麦聪旗下产品&am…...
Elasticsearch 快速入门指南
1. Elasticsearch 简介 Elasticsearch 是一个基于 Lucene 的开源分布式搜索和分析引擎,由 Elastic 公司开发。它具有以下特点: 分布式:可以轻松扩展到数百台服务器,处理 PB 级数据实时性:数据一旦被索引,…...
解决Mawell1.29.2启动SQLException: You have an error in your SQL syntax问题
问题背景 此前在openEuler24.03 LTS环境下的Hive使用了MySQL8.4.2,在此环境下再安装并启动Maxwell1.29.2时出现如下问题 [ERROR] Maxwell: SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version f…...
【Conda】环境应用至JupyterLab
目录 ✅ 步骤一:激活你的 conda 虚拟环境 ✅ 步骤二:安装 ipykernel(如果尚未安装) ✅ 步骤三:将环境注册为 Jupyter 内核 ✅ 步骤四:启动 JupyterLab 并选择内核 🧼 可选:删除…...
英语六级听力
试卷结构考试内容数量听力理解长对话8*7.1分听力篇章7*7.1分讲话/报道/讲座10*14.2分考点分析 A. 理解明示的信息 理解主旨大意听懂重要信息或特定的细节理解说话人明确表达的观点、态度等B. 理解隐含的信息 推论隐含的意义判断话语的交际功能推断说话人的观点、态度等C. 运用…...
视差计算,求指导
通过SGBM算法算出来的视差图,照片是3072*3072的, numDisparities是112,bloksize是7 不知道怎么调整了,求指导...
各个历史版本mysql/tomcat/Redis/Jdk/Apache/gitlab下载地址
mysql 各版本下载地址: https://downloads.mysql.com/archives/community/ **************************************************************** tomcat 各版本下载地址: https://archive.apache.org/dist/tomcat/ ********************************…...
【Redis】压缩列表
目录 1、背景2、压缩列表【1】底层结构【2】特性【3】优缺点 1、背景 ziplist(压缩列表)是redis中一种特殊编码的双向链表数据结构,主要用于存储小型列表和哈希表。它通过紧凑的内存布局和特殊的编码方式来节省内存空间。 2、压缩列表 【1…...
计算机网络--第一章(上)
目录 1.计算机网络的概念 2.计算机网络的组成、功能 3.交换 3.1 电路交换 3.2 报文交换 3.3 分组交换 3.4 虚拟电路交换 4.交换的性能分析 4.1 电路交换 4.2 报文交换 4.3 分组交换 4.4 总结 5.计算机网络的分类 5.1 分布范围分类 5.2 传输技术分类 5.3 拓扑结…...
hbit资产收集工具Docker(笔记版)
1. 安装 Docker 在 Kali 系统中,首先更新软件源,并安装 Docker apt-get update && apt-get upgrade && apt-get dist-upgrade apt-get install docker.io docker-compose安装完成后,使用 docker -v 命令验证安装是否成功。…...
套路化编程:C# winform ListView 自定义排序
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
CSS3 变形
一、CSS3变形(Transform)是一些效果的集合,有以下几种: 平移(Translate):元素沿水平或垂直方向移动。旋转(Rotate):元素绕某点旋转一定的角度。缩放…...
【python基础知识】Day26 函数
一、函数的定义 函数是一段具有特定功能的、可重用的语句组,用函数名来表示。在需要使用函数时,通过函数名进行调用。函数也可以看作一段具有名字的子程序,可以在需要使用它的地方进行调用执行,不需要在每个执行的地方重复编写这些…...
C#中Action的用法
Action 是 C# 中委托的一种,用于封装无返回值的方法。它引用的方法不能有返回值,但可以有零个或多个参数。相比delegate委托,Action 委托的优点是不必显式定义封装无参数过程的委托,使代码更加简洁和易读。 1、delegate-委托 先…...
IOS CSS3 right transformX 动画卡顿 回弹
卡片从右往左滑动,在同时变换 width height right transformX的时候 在某些IPhone机型上 会有卡顿,在Chrome和Android等很多机型都是OK的,包括我的iphone 14 pro max. IOS 18.2 也是好的。但是,新的iPhone16 也会卡,会…...
ruskal 最小生成树算法
https://www.lanqiao.cn/problems/17138/learning/ 并查集ruskal 最小生成树算法 Kruskal 算法是一种用于在加权无向连通图中寻找最小生成树(MST)的经典算法。其核心思想是基于贪心策略,通过按边权从小到大排序并逐步选择边,确保…...
多系统环境下,如何构建高效的主数据管理体系?
企业信息化建设步伐不断加快,各类业务系统如雨后春笋般涌现,如ERP、CRM、SCM、MES等等。然而,系统繁多也带来了一个棘手的问题:数据孤岛。各系统间数据标准不一、信息不流通、口径不统一,导致企业主数据(如…...
Linux515 rsync定时备份
凌晨1时三分进行备份 源码 code: code指定文件夹定时备份rsync到备份机指定文件夹 一.环境配置(code,backup) 1.关闭防火墙 设置selinux相关为0 setenforce 0 /etc/selinux/config SELINUXdisable 分别配置 2.设置主机名 3.配置ip地址(…...
Claude官方63组提示词模板全解析:从工作到生活的AI应用指南
在当今AI技术飞速发展的时代,大模型如ChatGPT、Claude等已成为我们工作和生活中不可或缺的助手。然而,许多用户发现同样的AI工具在不同人手中能产生截然不同的效果——关键在于提示词(Prompt)的质量。 提示词是与AI沟通的桥梁,好的提示词能…...
C#中的typeof操作符与Type类型:揭秘.NET反射的基础
引言 在C#编程中,反射(Reflection)是一种强大的机制,它允许我们在运行时检查和操作类型、方法、属性等程序元素。而这种反射能力的核心就是typeof操作符和System.Type类。当我们希望动态加载程序集、创建对象实例、调用方法&…...
鸿蒙OSUniApp 实现的表单验证与提交功能#三方框架 #Uniapp
UniApp 实现的表单验证与提交功能 前言 在移动端应用开发中,表单是用户与应用交互的重要媒介。一个好的表单不仅布局合理、使用方便,还应该具备完善的验证与提交功能,以确保用户输入的数据准确无误。本文将分享如何在 UniApp 中实现表单验证…...
开源的跨语言GUI元素理解8B大模型:AgentCPM-GUI
一、模型概述 AgentCPM-GUI 是由清华大学自然语言处理实验室 (THUNLP) 和 ModelBest 联合开发的开源大模型。该模型基于 MiniCPM-V 架构,拥有 80 亿参数规模,是一个能够直接在终端设备上运行的轻量化智能体。它创新性地将多模态输入与 GUI 操作相结合&a…...
Function Calling
在介绍Function Calling之前我们先了解一个概念,接口。 接口 两种常见接口: 人机交互接口,User Interface,简称 UI应用程序编程接口,Application Programming Interface,简称 API接口能「通」的关键,是两边都要遵守约定。 人要按照 UI 的设计来操作。UI 的设计要符合人…...
星巴克中国要卖在高点
9%能否救70%的急? 作者|古廿 编辑|文昌龙 星巴克中国刚刚回暖,总部出售的计划再次提上日程。 5月15日,外媒又适时放出消息:星巴克将开始出售其在中国的股份。消息人士称,星巴克本周通过一位财务顾问向几位潜在投资…...
Docker实现MySQL数据库主从复制
一、拉取数据库镜像 docker pull mysql:5.7二、创建两个数据库(一主一从模式) mysql01(主) 1.docker run -d -p 3310:3306 -v /root/mysql/node-1/init:/docker-entrypoinit-initdb.d -v /root/mysql/node-1/config:/etc/mysql/conf.d -v /root/mysq…...
【物联网】基于树莓派的物联网开发【4】——WIFI+SSH远程登录树莓派
使用背景 没有有线网络,无屏幕如何远程登录?程序猫教大家如何通过电脑wifi热点的方式连接树莓派,ssh连接访问树莓派,包括putty开源远程工具进行连接,VNC远程桌面显示。 注:新手建议买一个树莓派配置的显示…...
CentOS7 OpenSSL升级1.1.1w
1.安装依赖 # openssl-3.4.0需要perl-IPC-Cmd perl-Data-Dumper yum -y install gcc* yum -y install perl-IPC-Cmd perl-Data-Dumper 2.备份、卸载旧OpenSSL 查找安装目录并备份 # whereis openssl openssl: /usr/bin/openssl /usr/lib64/openssl /usr/share/man/man1/op…...
高精度降压稳压技术在现代工业自动化中的应用
一、引言 在现代工业自动化的浪潮中,电源管理技术犹如隐藏在精密机械背后的智囊,虽不直接参与生产流程的逻辑决策,却是保障各类自动化设备稳定、高效运行的基石。高精度降压稳压技术,作为电源管理领域的核心分支,聚焦…...
鸿蒙OSUniApp制作动态筛选功能的列表组件(鸿蒙系统适配版)#三方框架 #Uniapp
使用UniApp制作动态筛选功能的列表组件(鸿蒙系统适配版) 前言 随着移动应用的普及,用户对应用内容检索和筛选的需求也越来越高。在开发跨平台应用时,动态筛选功能已成为提升用户体验的重要组成部分。本文将详细介绍如何使用UniA…...
Qt中控件的Viewport作用
在Qt中,viewport是控件中用于显示内容的一个概念区域,它在可滚动控件中尤为重要。以下是viewport的主要作用和特点: 主要作用 内容显示区域:viewport定义了控件中实际可见的部分,所有内容都在这个区域内显示。 滚动机…...
论文学习_Precise and Accurate Patch Presence Test for Binaries
摘要:打补丁是应对软件漏洞的主要手段,及时将补丁应用到所有受影响的软件上至关重要,然而这一点在实际中常常难以做到,研究背景。因此,准确检测安全补丁是否已被集成进软件发行版本的能力,对于防御者和攻击…...
ubuntu服务器版启动卡在start job is running for wait for...to be Configured
目录 前言 一、原因分析 二、解决方法 总结 前言 当 Ubuntu 服务器启动时,系统会显示类似 “start job is running for wait for Network to be Configured” 或 “start job is running for wait for Plymouth Boot Screen Service” 等提示信息,并且…...
国产数据库工具突围:SQLynx如何解决Navicat的三大痛点?深度体验报告
引言:Navicat的"中国困境" 当开发者面对达梦数据库的存储过程调试,或是在人大金仓中处理复杂查询时,Navicat突然变得力不从心——这不是个例。 真实痛点:某政务系统迁移至OceanBase后,开发团队发现Navicat无…...
牛客网NC21994:分钟计算
牛客网NC21994:分钟计算 📝 题目描述 输入格式 输入两行,每行包含两个整数,分别表示小时和分钟第一行表示起始时间,第二行表示结束时间 输出格式 输出一个整数,表示两个时间点之间的分钟数 示例 输入…...
全球宠物经济新周期下的亚马逊跨境采购策略革新——宠物用品赛道成本优化三维路径
在全球"孤独经济"与"银发经济"双轮驱动下,宠物用品市场正经历结构性增长。Euromonitor数据显示,2023年全球市场规模突破1520亿美元,其中中国供应链贡献度达38%,跨境电商出口增速连续三年超25%。在亚马逊流量红…...
Tomcat多应用部署与静态资源路径问题全解指南
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
128.在 Vue 3 中使用 OpenLayers 实现绘制矩形截图并保存地图区域
📌 本文将介绍如何在 Vue 3 中使用 OpenLayers 实现: 1)用户可在地图上绘制矩形; 2)自动截取该区域地图为图片; 3)一键保存为本地 PNG 图片。 ✨效果如下图所示 🧠一、前言 在地图类…...
使用 163 邮箱实现 Spring Boot 邮箱验证码登录
使用 163 邮箱实现 Spring Boot 邮箱验证码登录 本文将详细介绍如何使用网易 163 邮箱作为 SMTP 邮件服务器,实现 Spring Boot 项目中的邮件验证码发送功能,并解决常见配置报错问题。 一、为什么需要邮箱授权码? 出于安全考虑,大…...
python处理异常,JSON
异常处理 #异常处理 # 在连接MySQL数据库的过程中,如果不能有效地处理异常,则异常信息过于复杂,对用户不友好,暴露过多的敏感信息 # 所以,在真实的生产环境中, 程序必须有效地处理和控制异常,按…...
原生微信小程序 textarea组件placeholder无法换行的问题解决办法
【问题描述】 微信小程序原生代码,使用文本域,placeholder使用\n 没有效果,网上找了一堆方案说使用 也没有效果 最后在一个前端大佬博客,找到解决办法,CSS设置word-wrap: break-word; white-space: pre-line; 【解决办…...
毕设设计 | 管理系统图例
文章目录 环素1. 登录、注册2. 菜单管理 环素 1. 登录、注册 2. 菜单管理 公告通知 订单管理 会员管理 奖品管理 新增、编辑模块...