Nitrite数据库(Java)使用和中文文档
Nitrite是一种无服务器、嵌入式且自包含的 NoSQL 数据库。它不需要安装只需要导入jar包即可使用。适合小型桌面/嵌入式项目。在Java 桌面项目中需要保存数据到本地还需要对这些数据做增删改查。最先想到的是用sqlite但是本人不太想用jdbc去写sql使用mybatis这些框架又很麻烦谷歌的Room又不能直接在java客户端用。经过一番寻找试错最后选择了Nitrite。使用Nitrite很方便导入jar包即可使用。Nitrite官网 https://nitrite.dizitart.comNitrite项目地址https://github.com/nitrite/nitrite-java可以参考我写的demogithubhttps://github.com/lieyanfeimao/nitrite-test码云https://gitee.com/edadmin/nitrite-test.git中文文档可以在下述网盘中的java技术文档/nitrite-嵌入式NoSql数据库中拿到(帮助文档只对java部分进行了详细修正)百度云盘 百度网盘 请输入提取码 提取码: aptd微云 文件分享Nitrite使用maven引入Nitrite 支持以对象的方式操作文档需要引入nitrite-jackson-mapper否则需要自己实现对象到文档的互相转换。properties nitrite.version4.3.2/nitrite.version /properties dependencies dependency groupIdorg.dizitart/groupId artifactIdnitrite/artifactId version${nitrite.version}/version /dependency dependency groupIdorg.dizitart/groupId artifactIdnitrite-mvstore-adapter/artifactId version${nitrite.version}/version /dependency dependency groupIdorg.dizitart/groupId artifactIdnitrite-jackson-mapper/artifactId version${nitrite.version}/version /dependency /dependencies dependencyManagement dependencies dependency groupIdorg.dizitart/groupId artifactIdnitrite-bom/artifactId version${nitrite.version}/version scopeimport/scope typepom/type /dependency /dependencies /dependencyManagement创建实体类创建测试用的实体类 Project、Version、VersionVOVersion类的属性 projectId 用来存储Project类的idVersionVO用于保存Version和Project关联查询的数据Project.javaimport org.dizitart.no2.index.IndexType; import org.dizitart.no2.repository.annotations.Entity; import org.dizitart.no2.repository.annotations.Id; import org.dizitart.no2.repository.annotations.Index; /** * author liuming */ Entity(value project,indices { //全文索引 Index(fields name,type IndexType.FULL_TEXT) }) public class Project { Id private Long id; private String name; private Integer age; private Integer sex; private String date; Override public String toString() { return Project{ id id , name name \ , age age , sex sex , date date \ }; } /** * 获取 Id * * return id Id */ public Long getId() { return this.id; } /** * 设置 Id * * param id Id */ public void setId(Long id) { this.id id; } /** * 获取 * * return name */ public String getName() { return this.name; } /** * 设置 * * param name */ public void setName(String name) { this.name name; } /** * 获取 * * return age */ public Integer getAge() { return this.age; } /** * 设置 * * param age */ public void setAge(Integer age) { this.age age; } /** * 获取 * * return sex */ public Integer getSex() { return this.sex; } /** * 设置 * * param sex */ public void setSex(Integer sex) { this.sex sex; } /** * 获取 * * return date */ public String getDate() { return this.date; } /** * 设置 * * param date */ public void setDate(String date) { this.date date; } }Version.javaimport org.dizitart.no2.index.IndexType; import org.dizitart.no2.repository.annotations.Entity; import org.dizitart.no2.repository.annotations.Id; import org.dizitart.no2.repository.annotations.Index; /** * author liuming */ Entity(value version,indices { //全文索引 Index(fields name,type IndexType.FULL_TEXT) }) public class Version { Id private Long id; private String name; private String nameEn; private String date; private Long projectId; Override public String toString() { return Version{ id id , name name \ , nameEn nameEn \ , date date \ , projectId projectId }; } /** * 获取 Id * * return id Id */ public Long getId() { return this.id; } /** * 设置 Id * * param id Id */ public void setId(Long id) { this.id id; } /** * 获取 * * return name */ public String getName() { return this.name; } /** * 设置 * * param name */ public void setName(String name) { this.name name; } /** * 获取 * * return nameEn */ public String getNameEn() { return this.nameEn; } /** * 设置 * * param nameEn */ public void setNameEn(String nameEn) { this.nameEn nameEn; } /** * 获取 * * return projectId */ public Long getProjectId() { return this.projectId; } /** * 设置 * * param projectId */ public void setProjectId(Long projectId) { this.projectId projectId; } /** * 获取 * * return date */ public String getDate() { return this.date; } /** * 设置 * * param date */ public void setDate(String date) { this.date date; } }VersionVO.javaimport java.util.List; /** * author liuming */ public class VersionVO { private Long id; private String name; private String nameEn; private ListProject projectList; private Project project; Override public String toString() { return VersionVO{ id id , name name \ , nameEn nameEn \ , project project }; } /** * 获取 * * return id */ public Long getId() { return this.id; } /** * 设置 * * param id */ public void setId(Long id) { this.id id; } /** * 获取 * * return name */ public String getName() { return this.name; } /** * 设置 * * param name */ public void setName(String name) { this.name name; } /** * 获取 * * return nameEn */ public String getNameEn() { return this.nameEn; } /** * 设置 * * param nameEn */ public void setNameEn(String nameEn) { this.nameEn nameEn; } /** * 获取 * * return projectList */ public ListProject getProjectList() { return this.projectList; } /** * 设置 * * param projectList */ public void setProjectList(ListProject projectList) { this.projectList projectList; if(this.projectList!null !this.projectList.isEmpty()){ this.projectthis.projectList.get(0); } } /** * 获取 * * return project */ public Project getProject() { return this.project; } /** * 设置 * * param project */ public void setProject(Project project) { this.project project; } }增删改查Nitrite默认将数据存储在内存中如需存储到磁盘需要在创建Nitrite对象时添加MVStoreModule模块。Nitrite文档是JSON形式的键值对格式不是Java对象为了方便的进行对象和Nitrite文档互相转换需要添加JacksonMapperModule模块。之后我们就可以通过 ObjectRepository 以操作Java对象的形式操作Nitrite文档。测试代码(TestMain.java)如下public class TestMain { public static void main(String[] args) { //数据库文件存储路径将在项目根目录生成一个>public class NitriteDataManager { private final static NitriteDataManager instancenew NitriteDataManager(); /** 数据库名 */ private final static String DB_NAMEdata.db; /** 数据库对象 */ private static Nitrite db; /** id字段的名称 */ private final static String ID_NAMEid; private NitriteDataManager(){ } public static NitriteDataManager getInstance(){ if(dbnull){ instance.initDb(null); } return instance; } /** * 初始化数据库 * param path 数据库文件路径 */ public static void initDb(String path){ if(StringUtils.isBlank(path)){ pathSystem.getProperty(user.dir)File.separatorDB_NAME; } MVStoreModule storeModule MVStoreModule.withConfig() .filePath(path) .build(); db Nitrite.builder() .loadModule(storeModule) .loadModule(new JacksonMapperModule()) .openOrCreate(); } /** * 关闭数据库 */ public void closeDb(){ if(db!null) db.close(); dbnull; } /** * 新增或删除。此方法针对id字段做了处理如果为long和int类型且值为null自动用当前id的最大值生成id效果类似id自增 * param t 数据 * return * param T */ public T int insertOrUpdate(T t){ try{ Class clst.getClass(); ObjectRepository repositorydb.getRepository(cls); //如果存在id字段并且id为空且id类型为 long/int/Long/Integer 自动生成一个id Field fieldcls.getDeclaredField(ID_NAME); if(field!null){ Class typefield.getType(); if(type Long.class || typeInteger.class || typelong.class || typeint.class){ field.setAccessible(true); Object objfield.get(t); if(objnull){ long idgenerateId(repository,field,t); if(typeLong.class || typelong.class) { field.set(t, id); }else{ field.set(t, (int)id); } } field.setAccessible(false); } } WriteResult resultrepository.update(t,true); db.commit(); return result.getAffectedCount(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(保存数据失败); } } /** * 删除数据 * param t 数据对象 * return * param T */ public T int delete(T t){ Class clst.getClass(); try{ ObjectRepository repositorydb.getRepository(cls); WriteResult resultrepository.remove(t); db.commit(); return result.getAffectedCount(); }catch (Exception e) { e.printStackTrace(); throw new RuntimeException(删除数据失败); } } /** * 删除数据 * param cls 类型 * param id 数据id * return * param T */ public T int delete(Class cls,Long id){ return delete(cls,new Long[]{id}); } /** * 删除数据 * param cls 类型 * param ids 数据id组 * return * param T */ public T int delete(Class cls,Long[] ids){ if(idsnull || ids.length0){ return 0; } try{ ObjectRepository repositorydb.getRepository(cls); WriteResult resultrepository.remove(FluentFilter.where(ID_NAME).in(ids)); db.commit(); return result.getAffectedCount(); }catch (Exception e) { e.printStackTrace(); throw new RuntimeException(删除数据失败); } } /** * 查询所有数据 * param cls * return * param T */ public T ListT queryAll(ClassT cls){ try{ ObjectRepository repositorydb.getRepository(cls); return repository.find().toList(); }catch (Exception e) { e.printStackTrace(); throw new RuntimeException(查询数据失败); } } /** * 查询数据 * param cls 类 * param filter 过滤器 * param findOptions 查询选项 * return * param T */ public T ListT queryList(ClassT cls,Filter filter,FindOptions findOptions){ try{ ObjectRepository repositorydb.getRepository(cls); return repository.find(filter,findOptions).toList(); }catch (Exception e) { e.printStackTrace(); throw new RuntimeException(查询数据失败); } } /** * 查询单条数据 * param cls 类 * param filter 过滤器 * param findOptions 查询选项 * return * param T */ public T T queryOne(ClassT cls,Filter filter,FindOptions findOptions){ try{ ObjectRepository repositorydb.getRepository(cls); return (T)(repository.find(filter,findOptions).firstOrNull()); }catch (Exception e) { e.printStackTrace(); throw new RuntimeException(查询数据失败); } } /** * 根据id查询数据 * param cls * param id * return * param T */ public T T queryById(ClassT cls,Long id){ try{ ObjectRepository repositorydb.getRepository(cls); return (T)repository.getById(id); }catch (Exception e) { e.printStackTrace(); throw new RuntimeException(查询数据失败); } } /** * 获取查询的游标 * param cls 类 * param filter 过滤器 * param findOptions 查询选项 * return */ public T CursorT getQueryCursor(ClassT cls,Filter filter,FindOptions findOptions){ try{ ObjectRepository repositorydb.getRepository(cls); return repository.find(filter,findOptions); }catch (Exception e) { e.printStackTrace(); throw new RuntimeException(查询数据失败); } } /** * 生成id * return */ private T long generateId(ObjectRepository repository,Field field,T t) throws Exception { synchronized (t.getClass()) { Object object repository.find(FindOptions.orderBy(ID_NAME, SortOrder.Descending)).firstOrNull(); if (object ! null) { return (Long.parseLong(field.get(object).toString())) 1; } } return 1L; } /** * 获取db对象 * return */ public Nitrite getDb(){ return db; } /** * 获取 ObjectRepository * param cls * return * param T */ public T ObjectRepositoryT getRepository(Class cls){ return db.getRepository(cls); } }使用封装的操作类增删改查接下来我们使用封装的 NitriteDataManager 进行增删改查操作。测试类(TestNitriteDataManagerMain.java)public class TestNitriteDataManagerMain { public static void main(String[] args) { /******* NitriteDataManager在初始化时会自动在项目根目录创建一个data.db文件.如果需要自定义数据库文件路径可以使用 initDb(path)方法。 *****/ // //数据库文件存储目录将在项目根目录生成一个 data-2.db // String pathSystem.getProperty(user.dir)File.separatordata-2.db; // //设置数据库存储路径并使用MVStore存储数据创建Nitrite对象 // NitriteDataManager.initDb(path); /** ----------- 添加/修改 数据 -------- **/ NitriteDataManager nmNitriteDataManager.getInstance(); //添加Project数据。与TestMain中代码有所区别的事这里不需要设置id,id会自动生成。 //用作id字段的名称必须为 id 否则不会自动生成由 NitriteDataManager 中的 ID_NAME 确定 addProject(nm); //添加Version数据。与TestMain中代码有所区别的事这里不需要设置id,id会自动生成。 //用作id字段的名称必须为 id 否则不会自动生成由 NitriteDataManager 中的 ID_NAME 确定 addVersion(nm); /** ----------- 查询数据 -------- **/ //查询所有Project数据 System.out.println(查询所有Project); ListProject projectListnm.queryAll(Project.class); for (Project project:projectList){ System.out.println(project); } System.out.println(Project 根据 sex 和 age 排序); FindOptions findOptionsFindOptions.orderBy(sex, SortOrder.Descending); //多列排序需要用findOptions.orderBy()对象获取SortableFields对象再往SortableFields中添加排序数据 findOptions.orderBy().addField(age,SortOrder.Ascending); //如果需要做分页查询使用如下代码。skip是跳过多少行limit是拿多少条数据 // findOptions.skip(1L).limit(1L); projectListnm.queryList(Project.class,null,findOptions); for (Project project:projectList){ System.out.println(project); } System.out.println(根据Id查询Version); //根据id查询数据 Version versionnm.queryById(Version.class,1L); System.out.println(version); //通过条件查询数据。此处使用正则匹配。此方式会扫描整个集合以查找匹配的文档不使用索引。 // ListVersion versionListnm.queryList(Version.class,FluentFilter.where(name).regex(.*?版本.*?),null); //通过条件查询数据。此处使用text过滤器。需要为属性添加全局索引。 ListVersion versionListnm.queryList(Version.class,FluentFilter.where(name).text(*版本*),null); System.out.println(按条件查询 name 中包含 \版本\ 的结果); for(Version v:versionList){ System.out.println(v); } //联接查询,join CursorProject projectCursornm.getQueryCursor(Project.class,null,null); CursorVersion versionCursornm.getQueryCursor(Version.class,null,null); Lookup lookup new Lookup(); lookup.setLocalField(projectId); lookup.setForeignField(id); //查出来的是个list不是单个对象需要手动处理一下可以参考 VersionVO 的 setProjectList 方法 lookup.setTargetField(projectList); RecordStream streamversionCursor.join(projectCursor,lookup, VersionVO.class); System.out.println(关联查询的结果); ListVersionVO voListstream.toList(); for (VersionVO vo:voList){ System.out.println(vo); } /**-------- 删除Project数据 ----- **/ projectListnm.queryAll(Project.class); System.out.println(删除前 Project数据条数projectList.size()); nm.delete(Project.class,new Long[]{1L,2L,3L}); System.out.println(Project 数据删除完成); projectListnm.queryAll(Project.class); System.out.println(删除后 Project数据条数projectList.size()); //批量删除 nm.delete(Version.class,new Long[]{1L,2L,3L}); System.out.println(Version 数据删除完成); } /** * 添加或删除 Version 数据 * param nm */ public static void addVersion(NitriteDataManager nm){ Version version1new Version(); version1.setName(是版本1); version1.setNameEn(Version 1); version1.setProjectId(1L); version1.setDate(2026); nm.insertOrUpdate(version1); Version version2new Version(); version2.setName(是版本2); version2.setNameEn(Version 2); version2.setProjectId(2L); version2.setDate(2027); nm.insertOrUpdate(version2); Version version3new Version(); version3.setName(第三条数据); version3.setNameEn(Version 3); version3.setProjectId(3L); version3.setDate(2028); nm.insertOrUpdate(version3); System.out.println(Version 数据添加完成); } /** * 添加 Project 数据 * param nm */ public static void addProject(NitriteDataManager nm){ Project project1new Project(); project1.setAge(7); project1.setName(项目1); project1.setSex(0); project1.setDate(数据1); nm.insertOrUpdate(project1); Project project2new Project(); project2.setAge(8); project2.setName(项目2); project2.setSex(0); project2.setDate(数据2); nm.insertOrUpdate(project2); Project project3new Project(); project3.setAge(9); project3.setName(项目3); project3.setSex(1); project3.setDate(数据3); nm.insertOrUpdate(project3); System.out.println(Project数据添加完成); } }

相关新闻

基于四树分割与直方图移动的可逆图像数据隐藏Matlab实现

基于四树分割与直方图移动的可逆图像数据隐藏Matlab实现

1. 先搞清楚“可逆图像数据隐藏”到底要解决什么问题如果你正在找一种方法,想在图片里藏点信息(比如一段文字、一个签名),并且希望将来能原封不动地把图片和藏的信息都恢复出来,那这个主题就值得你花时间看下去。它解决…

2026/8/3 3:55:46 阅读更多 →
3步解决Mac读写NTFS硬盘难题:Nigate免费开源跨平台文件传输工具终极指南

3步解决Mac读写NTFS硬盘难题:Nigate免费开源跨平台文件传输工具终极指南

3步解决Mac读写NTFS硬盘难题:Nigate免费开源跨平台文件传输工具终极指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, …

2026/8/3 3:55:46 阅读更多 →
突破性GitHub加速方案:如何将国内访问速度提升10倍的智能路由技术

突破性GitHub加速方案:如何将国内访问速度提升10倍的智能路由技术

突破性GitHub加速方案:如何将国内访问速度提升10倍的智能路由技术 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 在当…

2026/8/3 3:55:46 阅读更多 →

最新新闻

SpringBoot在服装行业数字化转型中的实践与应用

SpringBoot在服装行业数字化转型中的实践与应用

1. 项目概述:服装行业数字化转型的SpringBoot实践服装零售行业正经历从传统经营向数字化管理的转型浪潮。作为从业十余年的全栈开发者,我参与过多个服装企业管理系统项目,深知这个行业对高效运营的迫切需求。本次分享的"衣脉"服装连…

2026/8/3 4:42:16 阅读更多 →
OpenStack Neutron ML2插件多网络供应商支持机制解析

OpenStack Neutron ML2插件多网络供应商支持机制解析

1. 项目概述:Neutron网络架构与ML2核心插件OpenStack Neutron作为云平台的网络中枢,其核心价值在于解耦网络服务的实现细节与上层应用。ML2(Modular Layer 2)插件正是这种设计理念的典型体现——通过标准化接口抽象底层网络差异&a…

2026/8/3 4:42:16 阅读更多 →
编程实现三大经典数学问题:调和级数、排列数与亲和数

编程实现三大经典数学问题:调和级数、排列数与亲和数

1. 项目概述:三组经典数学问题的编程实现今天要分享的是三个看似简单却蕴含数学美感的编程题目:倒数数列求和、排列数计算和亲和数判断。这三个问题分别来自数列、组合数学和数论领域,虽然标注为"易",但在实际编程实现中…

2026/8/3 4:42:16 阅读更多 →
【导弹】多导弹协同模拟【含Matlab源码 15916期】

【导弹】多导弹协同模拟【含Matlab源码 15916期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…

2026/8/3 4:42:16 阅读更多 →
如何自动批量下载同步歌词?LRCGET让你的离线音乐库焕发新生

如何自动批量下载同步歌词?LRCGET让你的离线音乐库焕发新生

如何自动批量下载同步歌词?LRCGET让你的离线音乐库焕发新生 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 你是否曾为本地音乐文件缺少歌词…

2026/8/3 4:42:16 阅读更多 →
DeepSeek V4 Flash 正式版到底是怎么做到的?

DeepSeek V4 Flash 正式版到底是怎么做到的?

如果也把参数量提高的2万亿以上,甚至3三万亿,会不会因为可能存在严重安全隐患而被迫禁止开源? GPT 5.6 sol 这种闭源的模型,不应该用 Open AI ,这属于商标欺诈。应该长臂管辖。 今天看到有1次任务消耗Trae积分1万多…

2026/8/3 4:41:15 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →