当前位置: 首页 > news >正文

Flutter - 集成三方库:数据库(sqflite)

数据库

$ flutter pub add sqlite
$ flutter pub get
$ flutter run

运行失败,看是编译报错,打开Xcode工程 ⌘ + B 编译

2025-05-15 08.47.33.png

对比 GSYGithubAppFlutter 的Xcode工程Build Phases > [CP] Embed Pods Frameworks 有sqfite.framework。本地默认的Flutter工程默认未生成Podfile

2025-05-15 19.03.14.png

然后查看 GSYGithubAppFlutter

...
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)flutter_ios_podfile_setuptarget 'Runner' douse_frameworks!use_modular_headers!flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end
...

看代码是引入了Flutter提供的工具的,从flutter的安装目录下找到podhelper.rb这个文件

17473073456022.jpg

# 方法: flutter_install_all_ios_pods
# 安装Flutter在iOS平台上的引擎和插件
def flutter_install_all_ios_pods(ios_application_path = nil)# 创建Flutter引擎的.podspec文件flutter_install_ios_engine_pod(ios_application_path)flutter_install_plugin_pods(ios_application_path, '.symlinks', 'ios')
end
# 方法: flutter_install_plugin_pods
def flutter_install_plugin_pods(application_path = nil, relative_symlink_dir, platform)# CocoaPods定义了 defined_in_file,获取应用路径,未获取到就中断application_path ||= File.dirname(defined_in_file.realpath) if respond_to?(:defined_in_file)raise 'Could not find application path' unless application_path# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock# referring to absolute paths on developers' machines.# 使用符号链接,避免使用Podfile.lock这个文件# Flutter是在ios目录下创建.symlinks目录,里面有软链接指向Flutter下载包的位置,这样只需要一份即可。# 先删除,再创建对应的目录symlink_dir = File.expand_path(relative_symlink_dir, application_path)system('rm', '-rf', symlink_dir) symlink_plugins_dir = File.expand_path('plugins', symlink_dir)system('mkdir', '-p', symlink_plugins_dir)plugins_file = File.join(application_path, '..', '.flutter-plugins-dependencies')dependencies_hash = flutter_parse_plugins_file(plugins_file)plugin_pods = flutter_get_plugins_list(dependencies_hash, platform)swift_package_manager_enabled = flutter_get_swift_package_manager_enabled(dependencies_hash, platform)plugin_pods.each do |plugin_hash|plugin_name = plugin_hash['name']plugin_path = plugin_hash['path']...# 使用path: 的方式本地依赖需要的三方库# 手动添加打印确认下# print "plugin_name:#{plugin_name}\n"pod plugin_name, path: File.join(relative, platform_directory)end
end
$ pod update --verbose

2025-05-15 19.33.17.png

因此Podfile里的target部分就依赖了sqflite_darwin

target 'Runner' douse_frameworks!use_modular_headers!...pod 'sqflite_darwin', path:.symlinks/plugins/sqflite_darwin/darwin
end

2025-05-15 19.34.50.png

使用

打开/关闭/删除数据库
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'finger.db');/// 打开数据库
Database database = await openDatabase(path, version: 1,onCreate: (Database db, int version) async {/// 当创建数据库时创建tableawait db.execute('CREATE TABLE Test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)');
});
/// 关闭数据库
await db.close();
/// 删除数据库
await deleteDatabase(path);
/// 添加表
await database.execute("CREATE TABLE Test2(id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)",);/// 删除表
await database.execute('DROP TABLE Test2');
使用SQL语句
/// 添加数据
await database.transaction((txn) async {int id1 = await txn.rawInsert('INSERT INTO Test(name, value, num) VALUES("some name", 1234, 456.789)');int id2 = await txn.rawInsert('INSERT INTO Test(name, value, num) VALUES(?, ?, ?)',['another name', 12345678, 3.1416]);
});
/// 删除数据
count = await database.rawDelete('DELETE FROM Test WHERE name = ?', ['another name']);
/// 更新数据
int count = await database.rawUpdate('UPDATE Test SET name = ?, value = ? WHERE name = ?',['updated name', '9876', 'some name']);
/// 查询数据
List<Map> list = await database.rawQuery('SELECT * FROM Test');
print(list)

2025-05-17 20.31.58.png

使用工具方法

使用Sqflite提供的工具方法来执行数据库操作,而不是直接使用SQL语句

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';final String tName = 'company';
final String columnId = "_id";
final String columnName = "name";class Company {int? id;String? name;Company();Map<String, Object?> toMap() {var map = <String, Object?>{columnName: name};if (id != null) {map[columnId] = id;}return map;}Company.fromMap(Map map) {id = map[columnId];name = map[columnName];}
}class CompanyProvider {Database? db;Future<Database?> open() async {if (db == null) {var databasesPath = await getDatabasesPath();String path = join(databasesPath, 'demo.db');db = await openDatabase(path,version: 1,onCreate: (Database db, int version) async {await db.execute('''create table $tName ($columnId integer primary key autoincrement,$columnName text not null)''');},);}return db;}/// 注册企业Future insert(Company company) async {/// 工具方法: 传表名 + 列信息添加数据到数据库company.id = await db?.insert(tName, company.toMap());return company;}/// 查找企业Future findById(int id) async {List<Map> maps = await db!.query(tName, /// 表名columns: [columnId, columnName], /// 查找的列where: '$columnId = ?', /// 查找条件whereArgs: [id], /// 每个问号填充的值);if (maps.isNotEmpty) {return Company.fromMap(maps.first);}return null;}/// 查找所有的企业Future<List<Company>> find() async {List<Company> companys = [];List<Map> maps = await db!.query(tName, columns: [columnId, columnName]);for (var map in maps) {Company c = Company.fromMap(map);companys.add(c);}return companys;}/// 删除企业Future delete(int id) async {/// 根据id列删除企业return await db?.delete(tName, where: '$columnId = ?', whereArgs: [id]);}/// 更新企业信息Future update(Company company) async {return await db?.update(tName,company.toMap(),where: '$columnId = ?',whereArgs: [company.id],);}
}
void test() async {/// 添加2条测试数据CompanyProvider cp = CompanyProvider();await cp.open();List<Map> maps = [{"name": "Google"},{"name": "Apple"},];/// 新增数据int firstId = 0;for (int i = 0; i < maps.length; ++i) {Company c = Company.fromMap(maps[i]);cp.insert(c);}/// 查找数据List<Company> companys = await cp.find();if (companys.isNotEmpty) {firstId = companys.first.id!;}if (firstId > 0) {Company firstCompany = await cp.findById(firstId);print(firstCompany.toMap());/// 更新数据Company chgCompany = Company();chgCompany.id = firstId;chgCompany.name = DateTime.now().microsecondsSinceEpoch.toString();cp.update(chgCompany);firstCompany = await cp.findById(firstId);print(firstCompany.toMap());/// 删除数据cp.delete(firstId);}}

2025-05-20 15.33.50.png

数据库迁移

随着功能迭代,需要对数据库的表结构进行修改时,比如增加新字段时,需要对表的结构进行更新。

Future<Database?> open() async {if (db == null) {var databasesPath = await getDatabasesPath();String path = join(databasesPath, 'demo.db');db = await openDatabase(path,version: 2,/// 1.新版本发布时改成2onCreate: (db, version) async {/// 2.新安装设备触发onCreate,所以这里添加新的字段await db.execute('''create table $tName ($columnId integer primary key autoincrement,$columnName text not null,$columnDesc text)''');},onUpgrade: (db, oldVersion, newVersion) async {var batch = db.batch();/// [onUpgrade] is called if either of /// the following conditions are met:/// 1. [onCreate] is not specified/// 2. The database already exists and [version] is higher than the last database version/// onUpgrade回调在未指定onCreate回调或者数据库已经存在同时version字段高于已安装的版本,执行完onUpgrade回调后应该会更新关联的版本,设置断点让onUpgrade执行中断,下次还会会执行这个方法/// 3.对旧版本的设备:判断安装设备已创建的数据库版本if (oldVersion == 1) {_updateTableCompanyV1toV2(batch);}await batch.commit();},);}return db;}
/// 4.添加description字段
void _updateTableCompanyV1toV2(Batch batch) {batch.execute('ALTER TABLE Company ADD description TEXT');
}/// 其它的一些处理
final String columnDesc = "description";
...class Company {int? id;String? name;/// 5.模型增加对应字段 + 列String? description;.../// 6. 更新map和对象的转换方法Map<String, Object?> toMap() {var map = <String, Object?>{columnName: name, columnDesc: description};if (id != null) {...
/// 调用
...
firstCompany.description = "版本2新增的字段";
print(firstCompany.toMap());

2025-05-20 16.26.51.png

事务

数据库的增删改查可能会失败,导致数据与预期的不一致,为了保证在执行前后的数据一致性,引入了事务。事务具有ACID这4个特性:原子性、一致性、隔离性和持久性。

在事务中不要使用数据库,而只需要使用事务对象访问数据库。

await database.transaction((txn) async {// 正确await txn.execute('CREATE TABLE Test1 (id INTEGER PRIMARY KEY)');// 不要在事务中使用数据库// 下面会导致死锁await database.execute('CREATE TABLE Test2 (id INTEGER PRIMARY KEY)');
});
try {await database.transaction((txn) async {await txn.update('TABLE', {'foo': 'bar'});});// No error, the transaction is committed// 1. 未报错,则事务被提交// cancel the transaction (any error will do)// 2. 取消或执行时报错,则抛出异常在,catch中被捕获// throw StateError('cancel transaction');
} catch (e, st) {// this reliably catch if there is a key conflict// We know that the transaction is rolled back.// 3. 事务被回滚,执行业务相关的操作,比如提示报错
}
批处理

使用 Batch,即批处理,来避免在 Dart 和原生代码之间的反复切换。

batch = db.batch();
batch.insert('Test', {'name': 'item'});
batch.update('Test', {'name': 'new_item'}, where: 'name = ?', whereArgs: ['item']);
batch.delete('Test', where: 'name = ?', whereArgs: ['item']);
/// 批处理统一提交
results = await batch.commit();

在事务中,批处理的commit会等到事务提交后

await database.transaction((txn) async {var batch = txn.batch();// ...// commit but the actual commit will happen when the transaction is committed// however the data is available in this transaction/// 当事务被提交时才会真正的提交await batch.commit();//  ...
});
/// 设置批处理出现错误依然提交
await batch.commit(continueOnError: true);
表名和列名

SQLite的关键词,要避免使用作为实体(Entity)名。

"add","all","alter","and","as","autoincrement","between","case","check","collate","commit","constraint","create","default","deferrable","delete","distinct","drop","else","escape","except","exists","foreign","from","group","having","if","in","index","insert","intersect","into","is","isnull","join","limit","not","notnull","null","on","or","order","primary","references","select","set","table","then","to","transaction","union","unique","update","using","values","when","where"

sqflite的工具方法会进行处理,避免与关键字的冲突

db.query('table')
/// 等价于
db.rawQuery('SELECT * FROM "table"');

其它问题

VSCode 无法调试

Error connecting to the service protocol: failed to connect to http://127.0.0.1:51020/Kra7fZnYjeI=/ Error: Failed to register service methods on attached VM Service: registerService: (-32000) Service connection disposed

原来有成功过,后面发现一直都会有问题,前段时间突然不行,在长时间运行后就会报这个错误,但是单独在VSCode外部用flutter run命令能正常运行。

发现终端可以是把本地的端口转发的代理给去掉了。然后发现VSCode的代理有这样的说明,若未设置则会继承环境变量中的http_proxyhttps_proxy,我把代理加到.zshrc中,所以VSCode的默认会用代理,但是运行在真机上,手机没有代理,应该是这样影响了网络环境。

  1. .zshrc去掉代理的配置
  2. 重新打开VSCode && 运行 => 能正常调试

2025-05-15 18.54.02.png

参考

  1. SQLite CRUD operations in Flutter
  2. sqflite-doc
  3. sqflite Migration example

相关文章:

Flutter - 集成三方库:数据库(sqflite)

数据库 $ flutter pub add sqlite $ flutter pub get$ flutter run运行失败&#xff0c;看是编译报错,打开Xcode工程 ⌘ B 编译 对比 GSYGithubAppFlutter 的Xcode工程Build Phases > [CP] Embed Pods Frameworks 有sqfite.framework。本地默认的Flutter工程默认未生成Pod…...

野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(三)用yolov5-face算法实现人脸检测

环境直接使用第一篇中安装好的环境即可 先clone yolov5-face项目 git clone https://github.com/deepcam-cn/yolov5-face.git 并下载预训练权重文件yolov5n-face.pt 网盘链接: https://pan.baidu.com/s/1xsYns6cyB84aPDgXB7sNDQ 提取码: lw9j &#xff08;野火官方提供&am…...

基于matlabcd7.x的无网格近似方法

无网格近似方法&#xff08;Meshless Methods&#xff09;是一类数值计算方法&#xff0c;用于解决偏微分方程&#xff08;PDEs&#xff09;问题&#xff0c;特别是在几何形状复杂或需要动态网格更新的场景中。与传统的有限元方法&#xff08;FEM&#xff09;相比&#xff0c;无…...

塔式服务器都有哪些重要功能?

塔式服务器作为一种拥有着独特立式设计的服务器&#xff0c;能够帮助企业节省一定的放置空间&#xff0c;提供一系列的功能和优势&#xff0c;可以运用在多种应用场景当中&#xff0c;下面将探讨一下塔式服务器的主要功能都有哪些&#xff1f; 塔式服务器可以支持基本的应用程序…...

【基于SpringBoot的图书购买系统】深度讲解 分页查询用户信息,分析前后端交互的原理

引言&#x1f4da; 在企业级应用开发中&#xff0c;用户管理系统是几乎所有后台管理系统的核心模块之一。它不仅需要实现用户数据的增删改查&#xff0c;还需要考虑数据分页展示、状态管理、前后端交互效率等问题。本文将以一个实际的用户管理系统为例&#xff0c;详细讲解基于…...

机器学习算法-聚类K-Means

先来看看K-Means算法的核心流程吧 下面我们通过一个简单聚类来介绍K-Means算法迭代过程 如图(a)所示&#xff1a;表示初始化数据集。 如图(b)所示&#xff1a;假设K2&#xff0c;随机选择两个点作为类别质心&#xff0c;分别为图中的红色和蓝色质心。 如图©所示&#xff…...

初识Linux 进程:进程创建、终止与进程地址空间

目录 0.写在前面 1.进程创建 fork()&#xff1a; exec()&#xff1a; 2.进程地址空间 3.进程终止 正常终止&#xff08;主动退出&#xff09; 异常终止&#xff08;被动终止&#xff09; 0.写在前面 本文将对Linux环境下的进程&#xff1a;包括进程创建、终止与进程等待…...

2025年PMP 学习二十二 15章 项目绩效域

2025年PMP 学习二十二 15章 项目绩效域 文章目录 2025年PMP 学习二十二 15章 项目绩效域项目绩效域1.项目绩效域2.项目持续效域3.项目管理中的干系人管理 1.干系人持续效域促进干系人参与的步骤&#xff1a; 2 团队持续效域1 团队持续效域及项目团队人员有关系的活动和职能&…...

顶级流媒体服务商 Spotify 2025.04 故障复盘报告,吃他人的堑长自己的智

2025 年 4 月 16 日&#xff0c;Spotify 经历了一次影响全球用户的中断。以下就是发生了什么以及我们将如何解决它。 背景 我们使用 Envoy Proxy 作为我们的网络外围系统。外围是我们的软件接收用户&#xff08;您&#xff01;&#xff09;网络流量的第一部分。然后&#xff…...

服装收银系统哪个好?服装店进销存管理软件全面评测

在服装批发零售行业&#xff0c;选择一款合适的收银系统和进销存管理软件至关重要。好的系统不仅能提高工作效率&#xff0c;还能帮助商家精准掌握库存、优化销售策略。 本文将全面分析服装收银系统的选择标准&#xff0c;并重点介绍秦丝进销存这一专业解决方案。 一、服装收…...

Java程序员从0学AI(二)

一、前言 在上一篇文章中&#xff0c;我们初步认识了 AI 领域的核心基础概念&#xff0c;如大语言模型&#xff08;LLM&#xff09;的参数量特征、提示词&#xff08;Prompt&#xff09;对交互效果的关键作用、文本处理单元 Token 的独特定义&#xff0c;以及通过向量转换实现…...

进阶知识:无参的函数装饰器之深入理解@wraps()

进阶知识&#xff1a;无参的函数装饰器之深入理解wraps(func) 一、wraps(func)的本质解析 1.1 核心作用 wraps(func)是functools模块提供的装饰器工具&#xff0c;用于保留被装饰函数的元信息。它通过将被装饰函数的名称&#xff08;__name__&#xff09;、文档字符串&#…...

《C 语言 sizeof 与 strlen 深度对比:原理、差异与实战陷阱》

目录 一. sizeof 和 strlen 的对比 1.1 sizeof 1.2 strlen 1.3 对比表格 二. 数组和指针笔试题解析 2.1 一维数组 2.2 字符数组 2.2.1 代码练习一 2.2.2 代码练习二 2.2.3 代码练习三 2.2.4 代码练习四 2.2.5 代码练习五 2.2.6 代码练习六 2.3 二维数组 …...

C++ 初阶 | 类和对象易错知识点(上)

目录 0.引言 1.访问限定符 2.域 3.类的实例化和声明 4.this指针 5.构造函数&#xff08;自动执行&#xff09; 6.拷贝构造 7.运算符重载 8.日期类的实现 9.总结 0.引言 今天&#xff0c;小邓儿和大家分享一下&#xff0c;C在类和对象中的易错知识点&#x1f92d;&am…...

USB转TTL

USB转TTL模块是实现计算机USB接口与TTL电平串口设备&#xff08;如单片机、嵌入式系统&#xff09;通信的核心组件&#xff0c;其原理涉及协议转换和电平适配两大关键技术 一、核心功能与应用场景 功能&#xff1a;将计算机的USB信号&#xff08;高速差分信号、USB协议&#…...

汽车生产中的测试台连接 – EtherCAT 转CANopen高效的网关通信

使用 EtherCAT 和 CANopen协议&#xff0c;实现对汽车零部件的高效生产线末端测试 某电动机、电桥和变速箱制造商之一&#xff0c;正在其生产线上使用ETHERCAT转canopen网关WL-ECAT-COP的解决方案。集成到测试线中的下线测试必须映射众多待测设备的测试应用。该制造商已指定 Et…...

汽车充电过程中--各个电压的关系(DeepSeek)

在电动汽车的充电过程中&#xff0c;电池的充电机制涉及多个电压参数的协调控制&#xff0c;以下从原理到实际应用逐步分析&#xff1a; 1. 充电基础原理 电动汽车电池&#xff08;通常为锂离子电池组&#xff09;的充电本质是通过外部电源向电池注入电能&#xff0c;使锂离子…...

基于HTML的Word风格编辑器实现:从零打造功能完备的富文本编辑器

引言 在Web开发中&#xff0c;实现一个功能完备的富文本编辑器是一个常见需求。本文将基于HTML5和JavaScript&#xff0c;结合第三方库&#xff0c;打造一个具有Word风格界面的富文本编辑器&#xff0c;支持格式设置、图片插入、表格创建、文件导入导出等核心功能。 完整代码…...

亚远景-汽车软件开发的“升级之路”:ASPICE各等级说明

ASPICE&#xff08;Automotive SPICE&#xff09;将汽车软件开发过程的成熟度划分为六个等级&#xff0c;从0级到5级&#xff0c;每个等级代表了组织在软件开发过程中的不同能力水平。以下是各等级的详细说明&#xff1a; 等级0&#xff1a;不完整&#xff08;Incomplete&#…...

Unity Display 1 No cameras rendering

一个相机不能同时输出到屏幕和RenderTexture​​。 Output Texture&#xff0c;要么是 None &#xff08;屏幕&#xff09;&#xff0c;要么是RenderTexture。 如果此时相机已经输出到RenderTexture&#xff0c;场景中又没有别的相机在渲染&#xff0c;屏幕将变黑并显示No cam…...

Python Selenium 使用指南

Selenium 是一个用于自动化 Web 浏览器交互的强大工具&#xff0c;常用于网页测试、数据抓取和自动化任务。以下是 Python 中 Selenium 的详细使用说明。 安装 Selenium 首先需要安装 Selenium 库和浏览器驱动&#xff1a; pip install selenium 然后下载对应浏览器的驱动&…...

Cribl 对数据源进行过滤-01

先说一个项目中实际的例子: Cribl 利用filter expression 来过滤 data, 举个例子: source1: sourcerouter=A, source 2: sourcerouter=B, 这个时候,可以要把他们合并起来: sourcerouter=A || sourcerouter=B 来进行过滤想要的数据。 最后可以使用一个pipeline 来对数据进行…...

python 通过 pymysql 获取 select count(*) xxx 的数量

在使用 pymysql 库来获取 SELECT COUNT(*) 语句的结果时&#xff0c;你可以通过以下步骤实现&#xff1a; 安装 pymysql&#xff1a;如果你还没有安装 pymysql&#xff0c;可以通过 pip 安装它。 pip install pymysql连接到数据库&#xff1a;使用 pymysql.connect() 方法连接…...

定时任务延迟任务

二者的区别&#xff1a; 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间。 延迟任务&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在这个事件触发之后的一段时间内触发另一个事件&#xff0c;任务可以立即执行&#xff0…...

【动手学深度学习】1.1~1.2 机器学习及其关键组件

目录 一、引言1.1. 日常生活中的机器学习1.2. 机器学习中的关键组件1&#xff09;数据2&#xff09;模型3&#xff09;目标函数4&#xff09;优化算法 一、引言 1.1. 日常生活中的机器学习 应用场景&#xff1a; 以智能语音助手&#xff08;如Siri、Alexa&#xff09;的唤醒…...

LLaVA-MoD:基于MoE结构和蒸馏训练方法,训练轻量化多模态大模型!!

摘要&#xff1a;我们介绍了LLaVA-MoD&#xff0c;这是一个旨在高效训练小型多模态语言模型&#xff08;s-MLLM&#xff09;的创新框架&#xff0c;通过从大规模多模态语言模型&#xff08;l-MLLM&#xff09;中提取知识来实现。我们的方法解决了多模态语言模型&#xff08;MLL…...

YOLOv8 的双 Backbone 架构:解锁目标检测新性能

一、开篇&#xff1a;为何踏上双 Backbone 探索之路 在目标检测的领域中&#xff0c;YOLOv8 凭借其高效与精准脱颖而出&#xff0c;成为众多开发者和研究者的得力工具。然而&#xff0c;传统的单 Backbone 架构&#xff0c;尽管已经在诸多场景中表现出色&#xff0c;但仍存在一…...

SSRF(服务器端请求伪造)基本原理靶场实现

1、漏洞原理 攻击者通过构造恶意请求&#xff0c;诱使服务器向内部系统或第三方服务发起非预期的网络请求。其核心在于 服务器信任了不可信的用户输入&#xff0c;并基于该输入发起网络操作。 2、攻击场景与利用方式 1. 基础利用 攻击类型示例Payload目标读取本地文件file://…...

自动化测试脚本点击运行后,打开Chrome很久??

亲爱的小伙伴们大家好。 小编最近刚换了电脑&#xff0c;这几天做自动化测试发现打开Chrome浏览器需要等待好长时间&#xff0c;起初还以为代码有问题&#xff0c;或者Chromedriver与Chrome不匹配造成的&#xff0c;但排查后发现并不是&#xff01;&#xff01; 在driver.py中…...

Oracle中如何解决FREE BUFFER WAITS

基于性能上的考虑&#xff0c;服务器进程在扫描LRU主列的同时&#xff0c;会将脏块移至LRU-W列&#xff0c;如果发现没有足够可用&#xff08;可替换&#xff09;的BUFFER CACHE&#xff0c;进程并不会无止尽地扫描整条LRU主列&#xff0c;而是在扫描到某个阀值&#xff08;该阀…...

OpenHarmony开源鸿蒙兼容性测试常见问题解答分享

OpenHarmony 兼容性测评主要是验证合作伙伴的设备和业务应用满足 OpenHarmony 开源兼容性定义的技术要求&#xff0c;确保运行在 OpenHarmony 上的设备和业务应用能稳定、正常运行&#xff0c;同时使用 OpenHarmony 的设备和业务应用有一致性的接口和业务体验。 一、兼容性测评…...

Android trace presentFence屏幕显示的帧

Android trace presentFence屏幕显示的帧 presentFence &#xff1a;当帧成功显示到屏幕时&#xff0c;present fence就会signal。 FrameMissed/GpuFrameMissed/HwcFrameMissed表示上一次合成的结果&#xff0c;当SurfaceFlinger合成后显示到屏幕上&#xff0c;present fence就…...

【520特辑】情人节脑影像绘图

祝大家520快乐&#xff01; 永远爱自己&#xff01; 1.Brain Net基于节点画爱心 clear all; clc;t linspace(0, 2*pi, 30); x 16*sin(t).^3; y 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t); z zeros(size(t));[X,Y] meshgrid(linspace(-10,10,5), linspace(-10,10,5)); X …...

Linux服务器配置深度学习环境(Pytorch+Anaconda极简版)

前言&#xff1a; 最近做横向需要使用实验室服务器跑模型&#xff0c;之前用师兄的账号登录服务器跑yolo&#xff0c;3张3090一轮14秒&#xff0c;我本地一张4080laptop要40秒&#xff0c;效率还是快很多&#xff0c;&#xff08;这么算一张4080桌面版居然算力能比肩3090&#…...

如何理解大模型的幻觉输出及RAG技术的应用与实战案例

导读&#xff1a;大语言模型&#xff08;LLM&#xff09;在当今技术领域中扮演着越来越重要的角色&#xff0c;但其“幻觉输出”问题却成为实际应用中的痛点。本文将带你深入剖析这一现象的定义、表现形式及成因&#xff0c;并探讨如何通过RAG&#xff08;检索增强生成&#xf…...

std::vector<>.emplace_back

emplace_back() 详解&#xff1a;C 就地构造的效率革命 emplace_back() 是 C11 引入的容器成员函数&#xff0c;用于在容器尾部就地构造&#xff08;而非拷贝或移动&#xff09;元素。这一特性显著提升了复杂对象的插入效率&#xff0c;尤其适用于构造代价较高的类型。 一、核…...

卷积神经网络(CNN)学习率调整完全指南:从理论到PyTorch实践

引言 学习率是训练卷积神经网络(CNN)最重要的超参数之一&#xff0c;合理调整学习率可以显著提高模型性能、加速收敛并避免训练失败。本文将全面解析CNN学习率调整的技术与方法&#xff0c;涵盖基础概念、常用策略、PyTorch实现以及实用技巧。 一、学习率为什么如此重要&…...

KLEC--基于知识学习的演化计算算法

KLEC–基于知识学习的演化计算算法 title&#xff1a; Knowledge Learning for Evolutionary Computation author&#xff1a; Yi Jiang, Zhi-Hui Zhan, Kay Chen Tan, Jun Zhang. journal&#xff1a; IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION (TEVC) DOI&#xff…...

Git查看指定作者提交命令

要查看 Git 仓库中某个作者的提交记录&#xff0c;可以使用 git log 命令结合 --author 选项。以下是具体用法和示例&#xff1a; 基础命令 git log --author"作者名"作用&#xff1a;列出指定作者的所有提交记录。示例&#xff1a;查找作者名为 John Doe 的提交&am…...

隐形安全感

凌晨两点&#xff0c;手机突然震动。合作三年的化工原料供应商发来紧急消息&#xff1a;“一批次环氧树脂需要连夜从南京调往广州&#xff0c;但合作多年的物流公司临时爽约&#xff0c;能帮忙想想办法吗&#xff1f;” 我盯着屏幕愣了几秒。这类危险品运输从来不是简单的“拉…...

代码随想录算法训练营 Day52 图论Ⅲ 岛屿问题Ⅱ 面积 孤岛 水流 造岛

图论 题目 101. 孤岛的总面积 计算孤岛总面积&#xff0c;一个想法是将相邻的陆地的位置置为 0&#xff0c;最后计算孤岛面积中最小的一个 #include <iostream> #include <vector> #include <queue>using namespace std;int sum 0; int dir[4][2] {0,-1…...

实用 Git 学习工具推荐:Learn Git Branching

https://learngitbranching.js.org/?localezh_CN 网站概述 Learn Git Branching 是一个面向开发者的交互式 Git 学习平台&#xff0c;专为那些希望通过实践掌握 Git 高级用法的用户设计。网站采用游戏化的界面和渐进式挑战&#xff0c;让复杂的 Git 概念变得直观易懂。无论是…...

物流项目第三期(统一网关、工厂模式运用)

前两期&#xff1a; 物流项目第一期&#xff08;登录业务&#xff09;-CSDN博客 物流项目第二期&#xff08;用户端登录与双token三验证&#xff09;-CSDN博客 为什么要有网关&#xff1f; 通过前面的课程我们已经完成了四个端的登录&#xff0c;但是我们并没有对登录后的请…...

安卓settings单双屏显示

Settings/src/com/android/settings/homepage/SettingsHomepageActivity.java的onCreate方法中&#xff0c;创建布局之前会通过ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this);去获取是否使用嵌入式显示。 mIsEmbeddingActivityEnabled ActivityEmbeddingUtils.is…...

SpringCloud+Vue实现大文件分片下载(支持开始、暂停、继续、取消)

1. 实现效果 http://localhost:8089/#/demo 所有代码已提交至 https://github.com/SJshenjian/cloud.git与 https://github.com/SJshenjian/cloud-web.git中&#xff0c;欢迎star 2. 后端核心代码 FeignClient(value "download", contextId "download"…...

RK3576 Android 14.0 SDK开发指南(第一集)

RK3576 Android 14.0 SDK代码编译 SDK下载到本地后大概70多个G 下载后要做个校验 解压后内核源码 kernel代码路径说明 Android14支持6.1 版本的kernel&#xff0c;kernel源码在工程中kernel-6.1目录下 Lunch项说明 一键编译命令 ./build.sh -UKAupSoc RK3576 SDK默认没有开…...

【C/C++】现代C++线程池:从入门到生产级实现

文章目录 现代C线程池&#xff1a;从入门到生产级实现&#x1f9e0; What Is a Thread Pool?&#x1f9e9; Why Use a Thread Pool?&#x1f530; Part 1: Basic Thread Pool (Beginner)&#x1f527; Minimal Working Code:✅ Usage: &#x1f9d1;‍&#x1f52c; Part 2: …...

后期:daplink

问题描述: 问题一:总工程,USB插入能识别到dap,但有个黄色的感叹号!现在连感叹号都没有了。 重点跟踪了枚举的几个函数,差异点就是有个工厂描述符没有枚举到。 问题二: 下载后,目标板,没有自动复位。 问题三:未移植daplink的时候,虚拟串口是收发正常,貌似没有映射到…...

Android SharedPreferences:从零到一的全面解析与实战指南

简介 SharedPreferences是Android平台提供的一种轻量级键值对存储方案,虽然看似简单,但在实际开发中却蕴含着丰富的技术细节和最佳实践。本文将从基本概念出发,深入分析其源码实现原理,探讨企业级开发中的应用技巧,并提供完整的代码示例,帮助开发者全面掌握这一重要数据…...

推扫式高光谱相机VIX-N230重磅发布——开启精准成像新时代

随着各行业对高光谱成像技术需求的持续增长&#xff0c;市场对于高分辨率、高灵敏度以及快速成像的高光谱相机的需求愈发迫切。中达瑞和凭借多年的行业经验和技术积累&#xff0c;敏锐捕捉到这一市场趋势&#xff0c;正式推出全新一代推扫式可见光近红外高光谱相机——VIX-N230…...