Flutter——数据库Drift开发详细教程(四)
目录
- 参考
- 正文表达式
- 1.比较
- 2.布尔代数
- 3.算术
- BigIn
- 4.空值检查
- 6.日期和时间
- 7.IN和NOT IN
- 8.聚合函数(例如 count 和 sum)
- 8.1比较
- 8.2算术
- 8.4计数
- 8.5group_concat
- 8.9窗口函数
- 9.数学函数和正则表达式
- 10.子查询
- 10.1 标量子查询
- 10.2 isInQuery
- 10.3 存在
- 10.4完整子查询
- 11.自定义表达式
参考
- https://drift.simonbinder.eu/dart_api/expressions/
正文表达式
表达式是 SQL 的片段,数据库解释它们时会返回一个值。drift 的 dart_api 允许您在 Dart 中编写大多数表达式,然后将其转换为 SQL。表达式适用于各种情况。例如,where 期望一个返回布尔值的表达式。
大多数情况下,你编写的表达式会将其他表达式组合起来。任何列名都是有效的表达式,因此对于大多数where子句,你会编写一个将列名包装在某种比较中的表达式。
1.比较
每个表达式都可以使用
与值进行比较equals。如果要将一个表达式与另一个表达式进行比较,可以使用。对于数值和日期时间表达式,您还可以使用等equalsExpr各种方法
来比较它们:isSmallerThan 和 isSmallerOrEqual
// 查询小于 5 的 所有对象
(select(animals)..where((a) => a.amountOfLegs.isSmallerThanValue(5))).get();// find all animals who's average livespan is shorter than their amount of legs (poor flies)
(select(animals)..where((a) => a.averageLivespan.isSmallerThan(a.amountOfLegs)));Future<List<Animal>> findAnimalsByLegs(int legCount) {return (select(animals)..where((a) => a.amountOfLegs.equals(legCount))).get();
}
注意:根据下面图圈红标记,可以看到对应的参数的用途,具体效果可以自行测试
2.布尔代数
您可以使用&、|运算符和not漂移公开的方法来嵌套布尔表达式:
// find all animals that aren't mammals and have 4 legs
select(animals)..where((a) => a.isMammal.not() & a.amountOfLegs.equals(4));// find all animals that are mammals or have 2 legs
select(animals)..where((a) => a.isMammal | a.amountOfLegs.equals(2));
如果您有一个谓词列表,其中一个或全部需要匹配,则可以分别使用 Expression.or和Expression.and:
Expression.and([a.isMammal,a.amountOfLegs.equals(4),
]);
3.算术
对于int与double表达式,可以使用+、-、*和/运算符。要在 SQL 表达式和 Dart 值之间运行计算,请将其包装在Variable:
Future<List<Product>> canBeBought(int amount, int budget) {return (select(products)..where((p) {final totalPrice = p.price * Variable(amount);return totalPrice.isSmallerOrEqualValue(budget);})).get();
}
字符串表达式+也定义了一个运算符。正如你所期望的,它在 SQL 中执行连接操作。
对于整数值,可以使用~、bitwiseAnd和bitwiseOr执行按位运算:
Expression<int> bitwiseMagic(Expression<int> a, Expression<int> b) {// Generates `~(a & b)` in SQL.return ~(a.bitwiseAnd(b));
}
BigIn
虽然 SQLite 和 Dart VM 使用 64 位整数,但编译为 JavaScript 的 Dart 应用程序却不使用。因此,为了在编译到 Web 时表示大整数结果,您可能需要将表达式转换为BigInt。
使用dartCast()将确保结果被解释为BigInt漂移。这不会改变生成的 SQL,漂移对所有数据库都使用 64 位整数类型。
示例: 对于表达式,即使和被定义为常规整数,(table.columnA * table.columnB).dartCast()drift 也会将结果值报告为。BigIntcolumnAcolumnB
4.空值检查
要检查 SQL 中表达式的计算结果是否为NULL,可以使用isNull扩展:
final withoutCategories = select(todoItems)..where((row) => row.category.isNull());
true如果内部表达式解析为 null,则返回的表达式将解析为null,false否则解析为 null。正如你所料,isNotNull反之亦然。
要在表达式计算结果为 时使用后备值null,可以使用该coalesce 函数。它接受一个表达式列表,并计算第一个不为 的表达式null:
final category = coalesce([todoItems.category, const Constant(1)]);
这对应于??Dart 中的运算符。
6.日期和时间
对于返回的列和表达式,DateTime您可以使用 year、、、和getter 从该日期month中提取各个字段:dayhourminutesecond
select(users).where((u) => u.birthDate.year.isSmallerThanValue(1950));
year诸如、month等各个字段本身就是表达式。这意味着您可以对它们使用运算符和比较操作。要获取当前日期或当前时间作为表达式,请使用Drift 提供的currentDate 和常量。currentDateAndTime
您还可以使用+and-运算符在时间列中添加或减去持续时间:
Future<void> increaseDueDates() async {final change = TodoItemsCompanion.custom(dueDate: todoItems.dueDate + Duration(days: 1));await update(todoItems).write(change);
}
对于更复杂的日期时间转换,modifyandmodifyAll函数很有用。例如,这会将dueDate待办事项的每个值递增到星期一的同一时间:
Future<void> moveDueDateToNextMonday() async {final change = TodoItemsCompanion.custom(dueDate: todoItems.dueDate.modify(DateTimeModifier.weekday(DateTime.monday)));await update(todoItems).write(change);
}
7.IN和NOT IN
isIn您可以使用和方法检查表达式是否在值列表中isNotIn :
select(animals)..where((a) => a.amountOfLegs.isIn([3, 7, 4, 2]));
再次,该isNotIn函数以相反的方式工作。
8.聚合函数(例如 count 和 sum)
Dart API 提供了聚合函数。与常规函数不同,聚合函数可以同时对多行进行操作。默认情况下,它们会将 select
语句返回的所有行合并为一个值。你还可以使用 group by让它们对结果集中的不同组进行操作。
8.1比较
您可以在数值和日期时间表达式上使用min和max方法。它们分别返回结果集中的最小值或最大值。
8.2算术
、和方法可用。例如,你可以使用以下查询avg来查看待办事项的平均长度:sumtotal
Stream<double> averageItemLength() {final avgLength = todoItems.content.length.avg();final query = selectOnly(todoItems)..addColumns([avgLength]);return query.map((row) => row.read(avgLength)!).watchSingle();
}
注意:我们使用selectOnly而不是 ,select因为我们对任何提供的列都不感兴趣 todos——我们只关心平均长度。更多详情请见 此处。
8.4计数
有时,计算一个组中有多少行很有用。通过使用 示例中的表格布局,此查询将报告每个类别关联的待办事项数量:
final amountOfTodos = todoItems.id.count();final query = db.select(categories).join([innerJoin(todoItems,todoItems.category.equalsExp(categories.id),useColumns: false,)
]);
query..addColumns([amountOfTodos])..groupBy([categories.id]);
如果不想计算重复值,可以使用count(distinct: true)。有时,您只需要计算符合条件的值。为此,您可以使用filter参数 on count。要计算所有行(而不是单个值),可以使用顶级countAll() 函数。
有关如何使用 Drift 的 Dart API 编写聚合查询的更多信息,请参见 此处
8.5group_concat
该groupConcat函数可用于将多个值连接成一个字符串:
Stream<String> allTodoContent() {final allContent = todoItems.content.groupConcat();final query = selectOnly(todoItems)..addColumns([allContent]);return query.map((row) => row.read(allContent)!).watchSingle();
}
分隔符默认为逗号,周围没有空格,但可以使用separator参数 on进行更改groupConcat。
8.9窗口函数
除了聚合表达式和 之外groupBy,Drift 还支持窗口函数。与将一组行折叠为单个值的常规聚合不同,窗口函数允许对与当前行相关的行子集运行聚合。例如,您可以使用它来跟踪值的累计总数:
/// Returns all todo items, associating each item with the total length of all
/// titles up until (and including) each todo item.
Selectable<(TodoItem, int)> todosWithRunningLength() {final runningTitleLength = WindowFunctionExpression(todoItems.title.length.sum(),orderBy: [OrderingTerm.asc(todoItems.id)],);final query = select(todoItems).addColumns([runningTitleLength]);query.orderBy([OrderingTerm.asc(todoItems.id)]);return query.map((row) {return (row.readTable(todoItems)!, row.read(runningTitleLength)!);});
}
窗口函数的一个有趣用途是确定如果行按某列排序(实际上并不返回所有行,也不按该列排序),该行的排名。此排名可以附加到每一行:
/// Returns all todo items, also reporting the index (counting from 1) each
/// todo item would have if all items were sorted by descending content
/// length.
Selectable<(TodoItem, int)> todosWithLengthRanking() {final lengthRanking = WindowFunctionExpression(todoItems.id.count(),orderBy: [OrderingTerm.desc(todoItems.content.length)],);final query = select(todoItems).addColumns([lengthRanking]);return query.map((row) {return (row.readTable(todoItems)!, row.read(lengthRanking)!);});
}
9.数学函数和正则表达式
使用 时NativeDatabase,将提供一组基本的三角函数。它还定义了REGEXP函数,允许您a REGEXP b在 SQL 查询中使用。有关更多信息,请参阅此处的函数列表。
10.子查询
Drift 对表达式中的子查询有基本的支持。
10.1 标量子查询
标量子查询是一个只返回一行且只有一列的选择语句。由于它只返回一个值,因此它可以在另一个查询中使用:
Future<List<TodoItem>> findTodosInCategory(String category) async {final groupId = selectOnly(categories)..addColumns([categories.id])..where(categories.name.equals(category));final query = select(todoItems)..where((row) => row.category.equalsExp(subqueryExpression(groupId)));return await query.get();
}
这groupId是一个常规的 select 语句。默认情况下,drift 会选择所有列,因此我们使用它 selectOnly来仅加载我们关注的类别的 ID。然后,我们可以使用subqueryExpression该查询嵌入到我们用作过滤器的表达式中。
10.2 isInQuery
isIn与和isNotIn函数类似,您可以使用它isInQuery来传递子查询而不是直接传递一组值。
子查询必须返回一列,但允许返回多行。 isInQuery如果查询中存在该值,则返回 true。
10.3 存在
andexistsQuery函数notExistsQuery可用于检查子查询是否包含任何行。例如,我们可以用它来查找空类别:
Future<List<Category>> emptyCategories() {final hasNoTodo = notExistsQuery(select(todoItems)..where((row) => row.category.equalsExp(categories.id)));return (select(categories)..where((row) => hasNoTodo)).get();
}
10.4完整子查询
Drift 还支持出现在 s 中的子查询,这些子查询在joins 的文档JOIN中有描述 。
11.自定义表达式
如果要将自定义 SQL 内联到 Dart 查询中,可以使用CustomExpression类。它接受一个sql参数,允许您编写自定义表达式:
const inactive =CustomExpression<bool>("julianday('now') - julianday(last_login) > 60");
select(users)..where((u) => inactive);
注意:使用过多查询很容易导致无效查询CustomExpressions。如果您觉得需要使用它们,因为您使用的功能在 Drift 中不可用,请考虑创建问题告知我们。如果您只是喜欢 SQL,也可以查看 类型安全的编译型 SQL 。
尤其是在自定义表达式需要嵌入子表达式时,CustomExpression会有些限制。一种更复杂的替代方案是直接实现,它可以让你完全控制代码片段如何写入 SQL 。例如,这是一个使用 Drift 查询构建器实现行值的Expression表达式:
/// Writes row values (`(1, 2, 3)`) into SQL. We use [Never] as a bound because
/// this expression cannot be evaluated, it's only useful as a subexpression.
final class RowValues extends Expression<Never> {final List<Expression> expressions;RowValues(this.expressions); Precedence get precedence => Precedence.primary;void writeInto(GenerationContext context) {context.buffer.write('(');for (final (i, expr) in expressions.indexed) {if (i != 0) context.buffer.write(', ');expr.writeInto(context);}context.buffer.write(')');}
}
然后可以像这样使用它:
void rowValuesUsage() {select(animals).where((row) {// Generates (amount_of_legs, average_livespan) < (?, ?)return RowValues([row.amountOfLegs, row.averageLivespan]).isSmallerThan(RowValues([Variable(2), Variable(10)]));});
}
相关文章:
Flutter——数据库Drift开发详细教程(四)
目录 参考正文表达式1.比较2.布尔代数3.算术BigIn 4.空值检查6.日期和时间7.IN和NOT IN8.聚合函数(例如 count 和 sum)8.1比较8.2算术8.4计数8.5group_concat8.9窗口函数 9.数学函数和正则表达式10.子查询10.1 标量子查询10.2 isInQuery10.3 存在10.4完整…...
android-ndk开发(6): 查看反汇编
android-ndk开发(6): 查看反汇编 2025/05/05 1. 概要 android-ndk 是基于 clang 的工具链, clang 则保持了和 gcc 的高度兼容。 在 Linux 开发机上, GCC 套件里的 objdump 提供了反汇编的功能。 实际上 android-ndk 也提供了一份 objdump,…...
浅析AI大模型为何需要向量数据库?【入门基础】
文章目录 引言:大模型时代的存储挑战一、向量数据库:大模型的"海马体"1.1 什么是向量数据库?1.2 为什么大模型离不开向量数据库?(1) 嵌入(Embedding)的本质(2) 突破上下文窗口限制 二、相似性度量:欧氏距离与…...
Java面试:微服务与大数据场景下的技术挑战
面试对话场景 第一轮:基础知识考察 面试官:谢先生,您能简单介绍一下Java SE 8的新特性吗? 谢飞机:当然,Java SE 8引入了Lambda表达式、Stream API和新的日期时间API,大大简化了代码编写。 面…...
[前端]异步请求的竞态问题
竞态条件简介 遇到的问题 切换标签请求数据,但又快速切换标签请求数据,展示的是前一个标签的数据, 需要在切换标签时添加取消请求的机制,使用AbortController来取消正在进行的请求。当用户快速切换标签时,取消之前的请…...
【PDF拆分+提取内容改名】批量拆分PDF提取拆分后的每个PDF物流面单数据改名或导出表格,基于WPF的PDF物流面单批量处理方案
应用场景 物流行业每天需要处理大量包含物流面单的PDF文件,这些文件通常包含运单号、收发货人信息、货物详情等重要数据。传统手动处理方式效率低下且容易出错。本方案通过WPF实现一个自动化工具,能够: 批量拆分多页PDF为单页文件提取每页面单中的关键信息(如运单号、收件人…...
adb无线调试步骤
环境: macOS; 换成 linux 或 windows 也支持的小米15 Pro; 换成其他 android 手机也支持的 电脑和手机接入相同Wifi在电脑上,确保安装了 adb 对于 Android 开发者, 一般是是通过 Android Studio 安装对于 ndk 开发者…...
RocketMQ与Kafka的区别
文章目录 相同之处不同之处存储形式性能对比传输系统调用存储可靠性单机支持的队列数延时消息消息重复消息过滤消息失败重试死信队列 DLQ回溯消息分布式事务服务发现开发语言友好性开源社区活跃度商业支持成熟度 总结Kafka 和 RocketMQ 怎么选? 本文参考:…...
剥开 MP4 的 千层 “数字洋葱”:从外到内拆解通用媒体容器的核心
在当今数字化时代,MP4 格式随处可见,无论是在线视频、手机拍摄的短片,还是从各种渠道获取的音频视频文件,MP4 都占据着主流地位。它就像一个万能的 “数字媒体集装箱”,高效地整合和传输着各种视听内容。接下来&#x…...
设计模式(结构型)-组合模式
定义 组合模式的定义为:将对象组合成树形结构以表示 “部分 - 整体” 的层次结构,并且使得用户对单个对象和组合对象的使用具有一致性。其最关键的实现要点在于,简单对象和复合对象必须实现相同的接口,这一特性正是组合模式能够对…...
使用 IDEA + Maven 搭建传统 Spring MVC + Thymeleaf 项目的详细步骤
使用 IDEA Maven 搭建传统 Spring MVC Thymeleaf 项目 环境准备步骤 1:创建 Maven 项目步骤 2:添加依赖(pom.xml)步骤 3:配置 web.xml步骤 4:Spring 配置类(Java Config)步骤 5&am…...
「Mac畅玩AIGC与多模态19」开发篇15 - 判断节点与工具节点联动示例
一、概述 本篇在引入工具节点的基础上,进一步结合判断节点(条件分支),实现根据用户输入内容动态控制是否调用外部接口。通过构建“用户是否需要天气信息”的条件逻辑,开发人员将掌握如何在 Dify 工作流中通过条件判断…...
docker 外部能访问外网,内部不行(代理问题)
如果宿主机访问外网依赖代理(比如 http_proxy 环境变量),容器默认不会继承。需要显式传入代理: docker run -e http_proxy... -e https_proxy... ...在 docker-compose 中配置 HTTP/HTTPS 代理 version: 3 services:app:image: …...
模糊控制理论(含仿真)
本文讲解模糊控制理论、设计步骤以及案例。 1. 模糊控制原理: 模糊控制(Fuzzy Control)是一种基于模糊逻辑推理的人类经验规则实现的控制方法,适用于对系统模型不精确或难以建立精确数学模型的复杂系统。它利用“如果…那么…”&…...
《 C++ 点滴漫谈: 三十六 》lambda表达式
一、引言 在 C98 和 C03 时代,尽管 C 拥有强大的泛型编程能力和丰富的面向对象特性,但在表达局部逻辑、回调行为或一次性函数处理时,程序员却常常需要冗长的代码来定义函数对象(functor),或者使用函数指针…...
【C/C++】函数模板
🎯 C 学习笔记:函数模板(Function Template) 本文是面向 C 初学者的函数模板学习笔记,内容包括基本概念、定义与使用、实例化过程、注意事项等,附带示例代码,便于理解与复现。 📌 一…...
电赛经验分享——模块篇
1、前言 打算在这一个专栏中,分享一些本科控制题电赛期间的经验,和大家共同探讨,也希望能帮助刚刚参加电赛的同学,了解一些基本的知识。一些见解和看法可能不同或有错误,欢迎批评指正。 在本文中,主要介绍笔…...
LeetCode 热题 100 70. 爬楼梯
LeetCode 热题 100 | 70. 爬楼梯 大家好,今天我们来解决一道经典的动态规划入门题——爬楼梯。这道题在LeetCode上被标记为简单难度,要求我们计算爬到第n阶楼梯的不同方法数,每次可以爬1或2个台阶。下面我将详细讲解解题思路,并附…...
浔川AI测试版内测报告
浔川AI测试版内测报告 一、引言 本次对浔川AI测试版进行内测,旨在全面评估其功能表现与性能状况,为后续的优化升级及正式上线提供有力依据。 二、测试环境 1. 硬件环境:[Windows 10】 2. 软件环境:操作系统为【核桃编程]ÿ…...
Leetcode刷题记录31——旋转图像
题源:https://leetcode.cn/problems/rotate-image/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述: 思路一: 💡 解题思路:分两步完成旋转 虽然“直接旋转”看起来有点抽象,但我们…...
攻防世界-php伪协议和文件包含
fileinclude 可以看到正常回显里面显示lan参数有cookie值表示为language 然后进行一个判断,如果参数不是等于英语,就加上.php,那我们就可以在前面进行注入一个参数,即flag, payload:COOKIE:languageflag …...
[C++] 小游戏 决战苍穹
大家好,各位看到这个标题,斗破苍穹什么时候改叫决战苍穹了?其实,因为版权等一系列问题,斗破苍穹正式改名为决战苍穹,这个版本主要更新内容为解决了皇冠竞技场太过影响游戏平衡,并且提高了一些装…...
项目成本管理_挣得进度ES
在项目成本管理的新实践中, 通过挣值管理(EVM) 的扩展,引入 挣得进度ES 这一概念, ES是EVM理论和实践的延伸,挣得进度理论用ES和实际时间(AT) 替代了传统EVM所使用的进度偏差测量指标SV(挣值—计划价值)。 使用这种替代方法计算…...
矩阵快速幂 快速求解递推公式
文章目录 习题790.多米诺和托米诺平铺 对于一个给定的递推公式,例如dp[i] dp[i-1] * a dp[i-2] * b,那么常用的做法,肯定是使用o(n)的时间复杂度进行线性求解,但是如果 n 10 18 n{10}^{18} n1018,那么肯定超时的,这…...
驱动开发硬核特训 · Day 28(上篇):pinctrl 子系统详解与实战分析
📅 日期:2025-05-05 📚 技术平台:嵌入式Jerry(B站) 一、引言 在嵌入式系统中,SoC 芯片的引脚通常具有多种功能,如 GPIO、UART、I2C、SPI 等。为了在不同的应用场景中灵活配置引脚功…...
20250505下载VLC for Android
20250505下载VLC for Android 2025/5/5 14:35 缘起:做Rockchip的RK3566的Android13下的跨网段PING。 酷芯的图传网段 和 softAP/以太网RJ45共享网段之间互相PING通。 图传的原厂/供应商说可以使用ffmpeg进行rtsp流的转发。 后来确认VLC for Android版本只有接受流&a…...
Jetpack Compose 响应式布局实战:BoxWithConstraints 完全指南
深入理解 Jetpack Compose 中的 BoxWithConstraints 前言 在构建现代 Android 应用时,响应式设计已成为必不可少的要求。Jetpack Compose 作为 Android 的现代 UI 工具包,提供了 BoxWithConstraints 这一强大组件,帮助我们轻松创建能够适应…...
ZYNQ笔记(十七):IP核封装与接口定义
版本:Vivado2020.2(Vitis) 任务:将“HDMI彩条显示实验”(正点原子 ZYNQ FPGA 开发视频)中所实现的 RGB2DVI 模块封装成一个 IP 核。 目录 一、介绍 (1)IP核 (2&#x…...
学习笔记msp430f5529lp
注:本文仅用于个人学习使用,记录笔记。 学习视频msp430f5529库函数入门教程 00.序言_哔哩哔哩_bilibili 向大佬致敬理工男小帅-CSDN博客 CCS环境快捷键使用 代码注释:Ctrl/ 提示/补全: CtrlShiftC 放大:Ctrl 缩小:Ctrl- 切换选择模式&…...
人工智能应用:从技术突破到生态重构的演进之路
一、人工智能的发展历程:从符号主义到通用智能探索 人工智能(AI)的发展始于20世纪中叶,其历程可划分为四个关键阶段: 符号主义与早期探索(1950s-1970s) 以逻辑推理和专家系统为核心&…...
【ZYNQ Linux移植】4-内核移植
文章目录 0 写在前面1 内核源码的文件结构2 Linux内核移植2.1 移植配置文件2.2 移植设备树2.3 创建脚本进行编译2.4 备份相关文件 3 测试4 总结5 参考资料 0 写在前面 这是一个系列博客,详细介绍如何在 ZYNQ 与 ZYNQ MP 平台上如何移植 Linux 系统。目前网络上的大部…...
代码随想录算法训练营第三十二天
LeetCode/卡码网题目: 518. 零钱兑换 II377. 组合总和 Ⅳ790. 多米诺和托米诺平铺(每日一题)57. 爬楼梯(第八期模拟笔试) 其他: 今日总结 往期打卡 背包问题特点: 滚动数组背包遍历顺序 完全背包从小到大,即基于当前物品更新过的继续更新01背包从大到…...
java CompletableFuture 异步编程工具用法1
1、测试异步调用: static void testCompletableFuture1() throws ExecutionException, InterruptedException {// 1、无返回值的异步任务。异步线程执行RunnableCompletableFuture.runAsync(() -> System.out.println("only you"));// 2、有返回值的异…...
Spring Boot 集成 Solr 的详细步骤及示例
环境准备 安装 Solr :从 Solr 官网(Welcome to Apache Solr - Apache Solr)下载并安装最新版本,然后通过命令 bin/solr start 启动 Solr 服务,使用 bin/solr create -c mycore 创建一个新的 Solr 核心。 安装 JDK &am…...
Nemotron-Research-Tool-N1 如何提升大语言模型工具使用能力?
Nemotron-Research-Tool-N1如何提升大语言模型工具使用能力? 如今,大语言模型(LLMs)发展迅猛,给它配备外部工具成为研究热点。但传统方法存在不少问题。这篇论文提出的Nemotron-Research-Tool-N1系列模型带来新突破&a…...
OpenCV进阶操作:图像直方图、直方图均衡化
文章目录 一、图像直方图二、图像直方图的作用三、使用matplotlib方法绘制直方图2.使用opencv的方法绘制直方图(划分16个小的子亮度区间)3、绘制彩色图像的直方图 四、直方图均衡化1、绘制原图的直方图2、绘制经过直方图均衡化后的图片的直方图3、自适应…...
Android控件VideoView用法
一 控件UI <VideoViewandroid:id="@+id/videoView"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitCenter" /> 二 配置 <?xml version="1.0" encoding="u…...
人工智能数学基础(十)—— 图论
图论作为数学的重要分支,为人工智能提供了强大的建模和分析工具。无论是社交网络分析、路径规划还是数据结构设计,图论都发挥着不可替代的作用。今天,我将带领大家深入浅出地探索图论的核心概念,并结合 Python 实例,让…...
深入探索Anthropic Claude与Spring AI的融合应用
深入探索Anthropic Claude与Spring AI的融合应用 前言 在人工智能的蓬勃发展进程中,自然语言处理领域不断涌现出强大的模型和工具。Anthropic Claude系列基础AI模型凭借其出色的性能,在各种应用场景中展现出巨大潜力,为开发者和企业提供了丰…...
Python爬虫实战:获取优美图库各类高清图片,为用户提供设计素材
一、引言 在互联网时代,高清壁纸资源丰富多样,而优美图库作为一个提供大量精美壁纸的网站,吸引了众多用户。通过 Python 爬虫技术,可以自动化地从该网站获取所需的壁纸资源,为用户节省时间和精力。然而,网站通常会采取反爬措施来防止数据被恶意抓取,因此需要在爬虫程序…...
Java常用注解大全(基于JDK17+SpringBoot3)
一、基础注解(Java原生) 编译相关 @Override:方法重写校验 java 复制 下载 @Override public String toString() { return "CustomObj"; } @Deprecated:标记过时元素 java 复制 下载 @Deprecated(since="1.8", forRemoval=true) public void oldMethod…...
【NLP】30. 深入理解 In-Context Learning 的核心机制与策略
In-Context Learning(ICL)详解:提示学习时代的语言理解 一、什么是 In-Context Learning(ICL)? In-Context Learning 是指: 不改变模型参数,通过在输入中加入示例(demon…...
数字化工厂中央控制室驾驶舱系统 - Windows 部署笔记
数字化工厂中央控制室驾驶舱系统 - Windows 部署笔记 环境准备 这篇笔记记录了我在 Windows 10/11 上部署数字化工厂中央控制室驾驶舱系统的全过程,包括各种常见问题的解决方法。部署过程中使用了国内镜像源来加快下载速度。 前置需求 Python:3.8 到…...
数据库的原子事务
原子事务 11.1 全有或全无效应 二级索引需要原子性的多键更新,这不仅对数据库内部一致性至关重要,也对应用数据的一致性非常有用(例如考虑账户余额和账户交易)。 我们将放弃get-set-del接口,并添加一个新的接口来允…...
基于51单片机的红外人体感应报警器
基于51单片机的人体监测报警 (仿真+程序+原理图+PCB) 功能介绍 具体功能: 1.按下报警按钮会发生红LED蜂鸣器声光报警; 2.若检测到人,黄LED打开; 3.按下布防按键&…...
从Excel到高级工具:数据分析进阶指南
从Excel到高级工具:数据分析进阶指南 在数据分析的世界里,Excel曾经是众多人的第一站。它简单、直观、功能强大,从普通用户到专业人士,无不对其依赖。然而,随着数据规模增长、分析需求升级,Excel渐渐显得力…...
Excel VBA 自定义函数
一、VBA 函数基础概念 在 Excel VBA 中,函数主要分为两种类型: Sub 过程:执行操作但不返回值Function 函数:执行操作并返回结果 基本语法示例 1. Function 函数示例 定义一个返回字符串的公共函数 Public Function GetGreetin…...
004-nlohmann/json 快速认识-C++开源库108杰
了解 nlohmann/json 的特点;理解编程中 “数据战场”划分的概念;迅速上手多种方式构建一个JSON对象; 1 特点与安装 nlohmann/json 是一个在 github 长期霸占 “JSON” 热搜版第1的CJSON处理库。它的最大优点是与 C 标准库的容器数据…...
【Quest开发】接入语音转文字
参考官方文档:https://developers.meta.com/horizon/documentation/unity/voice-sdk-tutorials-overview 软件:Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件:Meta Quest3 注意:需全程科学上网 Meta提供了一…...
Vim 命令从头学习记录
学习链接:eleon-vim基础教程 Vim - 基础翻屏操作 光标移动:hjkl 20j 向下移动20行,w 向后移动一个字符,b 向前移动一个字符。 Ctrl u 向上翻半页 UP Ctrl d 向下翻半页 Down Ctrl f 向下翻整页 Forward Ctrl b 向上翻整页 …...