深入HarmonyOS NEXT开发中的ArkData操作SQLite数据库

news/2025/3/9 8:47:23/文章来源:https://www.cnblogs.com/wgjava/p/18756970

大家好,我是 V 哥。今天给大家整理的内容是关于鸿蒙 NEXT 开发中使用 ArkData 操作 SQLite 数据库的详细介绍,从入门到精通,包含案例代码和注释,帮助小白快速入门到提升。先赞后看,家财万贯。

使用 ArkData实现 SQLLite 的 CRUD 操作

1. 环境准备

在开始之前,确保你已经安装了 DevEco Studio,并且配置好了鸿蒙开发环境。同时,要创建一个鸿蒙 NEXT 项目。

2. 引入 ArkData 库

module.json5 文件中添加 ArkData 依赖:

{"module": {"reqPermissions": [{"name": "ohos.permission.DISTRIBUTED_DATASYNC","reason": "For data synchronization"}],"dependencies": {"arkdata": {"version": "1.0.0","visibility": "public"}}}
}

3. 入门:创建数据库和表

以下是一个简单的示例,展示如何创建一个 SQLite 数据库和一个表:

// 导入 ArkData 相关模块
import { Database, DatabaseConfig } from '@ohos.data.arkdata';async function createDatabaseAndTable() {try {// 配置数据库const config: DatabaseConfig = {name: 'myDatabase.db', // 数据库名称securityLevel: 1 // 安全级别};// 打开或创建数据库const database: Database = await Database.open(config);// 创建表的 SQL 语句const createTableSql = `CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER);`;// 执行 SQL 语句await database.executeSql(createTableSql);console.log('Database and table created successfully.');// 关闭数据库await database.close();} catch (error) {console.error('Error creating database and table:', error);}
}// 调用函数创建数据库和表
createDatabaseAndTable();

代码解释

  • 首先导入 DatabaseDatabaseConfig 模块。
  • 定义数据库配置 config,指定数据库名称和安全级别。
  • 使用 Database.open 方法打开或创建数据库。
  • 编写创建表的 SQL 语句,并使用 database.executeSql 方法执行该语句。
  • 最后关闭数据库。

4. 插入数据

以下是向 users 表中插入数据的示例:

async function insertData() {try {const config: DatabaseConfig = {name: 'myDatabase.db',securityLevel: 1};const database: Database = await Database.open(config);// 插入数据的 SQL 语句const insertSql = 'INSERT INTO users (name, age) VALUES (?, ?)';const values = ['John Doe', 30];// 执行插入操作await database.executeSql(insertSql, values);console.log('Data inserted successfully.');await database.close();} catch (error) {console.error('Error inserting data:', error);}
}// 调用函数插入数据
insertData();

代码解释

  • 打开数据库。
  • 编写插入数据的 SQL 语句,使用 ? 作为占位符。
  • 定义要插入的值数组 values
  • 使用 database.executeSql 方法执行插入操作,并传入 SQL 语句和值数组。
  • 关闭数据库。

5. 查询数据

以下是从 users 表中查询数据的示例:

async function queryData() {try {const config: DatabaseConfig = {name: 'myDatabase.db',securityLevel: 1};const database: Database = await Database.open(config);// 查询数据的 SQL 语句const querySql = 'SELECT * FROM users';// 执行查询操作const resultSet = await database.querySql(querySql);// 遍历结果集while (await resultSet.goToNextRow()) {const id = await resultSet.getLong(0);const name = await resultSet.getString(1);const age = await resultSet.getLong(2);console.log(`ID: ${id}, Name: ${name}, Age: ${age}`);}// 关闭结果集await resultSet.close();await database.close();} catch (error) {console.error('Error querying data:', error);}
}// 调用函数查询数据
queryData();

代码解释

  • 打开数据库。
  • 编写查询数据的 SQL 语句。
  • 使用 database.querySql 方法执行查询操作,返回一个 ResultSet 对象。
  • 使用 resultSet.goToNextRow 方法遍历结果集,使用 resultSet.getLongresultSet.getString 方法获取每行的数据。
  • 关闭结果集和数据库。

6. 更新数据

以下是更新 users 表中数据的示例:

async function updateData() {try {const config: DatabaseConfig = {name: 'myDatabase.db',securityLevel: 1};const database: Database = await Database.open(config);// 更新数据的 SQL 语句const updateSql = 'UPDATE users SET age = ? WHERE name = ?';const values = [31, 'John Doe'];// 执行更新操作await database.executeSql(updateSql, values);console.log('Data updated successfully.');await database.close();} catch (error) {console.error('Error updating data:', error);}
}// 调用函数更新数据
updateData();

代码解释

  • 打开数据库。
  • 编写更新数据的 SQL 语句,使用 ? 作为占位符。
  • 定义要更新的值数组 values
  • 使用 database.executeSql 方法执行更新操作。
  • 关闭数据库。

7. 删除数据

以下是从 users 表中删除数据的示例:

async function deleteData() {try {const config: DatabaseConfig = {name: 'myDatabase.db',securityLevel: 1};const database: Database = await Database.open(config);// 删除数据的 SQL 语句const deleteSql = 'DELETE FROM users WHERE name = ?';const values = ['John Doe'];// 执行删除操作await database.executeSql(deleteSql, values);console.log('Data deleted successfully.');await database.close();} catch (error) {console.error('Error deleting data:', error);}
}// 调用函数删除数据
deleteData();

代码解释

  • 打开数据库。
  • 编写删除数据的 SQL 语句,使用 ? 作为占位符。
  • 定义要删除的数据条件值数组 values
  • 使用 database.executeSql 方法执行删除操作。
  • 关闭数据库。

通过以上步骤,你可以在鸿蒙 NEXT 开发中使用 ArkData 操作 SQLite 数据库,从创建数据库和表,到插入、查询、更新和删除数据。

鸿蒙开发中使用ArkData的最佳实践

在鸿蒙开发中,ArkData 是一个强大的数据管理框架,用于操作数据库等数据存储,以下为你分享一些使用 ArkData 的最佳实践:

1. 数据库初始化与管理

1.1 合理配置数据库

在创建数据库时,根据应用的安全需求合理设置安全级别。例如:

import { Database, DatabaseConfig } from '@ohos.data.arkdata';async function initDatabase() {const config: DatabaseConfig = {name: 'myAppDatabase.db',securityLevel: 1 // 根据实际情况选择合适的安全级别};try {const database = await Database.open(config);// 进行后续数据库操作return database;} catch (error) {console.error('Failed to open database:', error);}
}

1.2 数据库版本管理

随着应用的迭代,数据库结构可能会发生变化。可以在应用中实现数据库版本管理,确保数据库的升级和迁移操作正确执行。例如,在打开数据库时检查版本号并进行相应处理:

async function openDatabaseWithVersion() {const config: DatabaseConfig = {name: 'myAppDatabase.db',securityLevel: 1};const database = await Database.open(config);const currentVersion = await database.getVersion();if (currentVersion < 2) {// 执行数据库升级操作await upgradeDatabase(database);await database.setVersion(2);}return database;
}async function upgradeDatabase(database) {// 编写数据库升级的 SQL 语句并执行const upgradeSql = 'ALTER TABLE myTable ADD COLUMN newColumn TEXT';await database.executeSql(upgradeSql);
}

2. 数据操作优化

2.1 批量操作

当需要插入或更新大量数据时,使用批量操作可以显著提高性能。例如,批量插入数据:

async function batchInsertData(database) {const insertSql = 'INSERT INTO myTable (column1, column2) VALUES (?, ?)';const dataToInsert = [['value1', 'value2'],['value3', 'value4'],// 更多数据...];await database.beginTransaction();try {for (const values of dataToInsert) {await database.executeSql(insertSql, values);}await database.commitTransaction();} catch (error) {await database.rollbackTransaction();console.error('Batch insert failed:', error);}
}

2.2 合理使用索引

对于经常用于查询条件的列,创建索引可以加快查询速度。例如,在创建表时为经常查询的列添加索引:

async function createTableWithIndex(database) {const createTableSql = `CREATE TABLE myTable (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,age INTEGER);`;const createIndexSql = 'CREATE INDEX idx_name ON myTable (name)';await database.executeSql(createTableSql);await database.executeSql(createIndexSql);
}

3. 错误处理与资源管理

3.1 全面的错误处理

在进行数据库操作时,要对可能出现的错误进行全面的捕获和处理,避免应用崩溃。例如:

async function performDatabaseOperation() {try {const database = await initDatabase();// 执行数据库操作await database.executeSql('SELECT * FROM myTable');await database.close();} catch (error) {console.error('Database operation failed:', error);}
}

3.2 资源及时释放

在完成数据库操作后,及时关闭数据库连接和结果集,避免资源泄漏。例如:

async function queryData() {const database = await initDatabase();try {const querySql = 'SELECT * FROM myTable';const resultSet = await database.querySql(querySql);while (await resultSet.goToNextRow()) {// 处理结果集数据}await resultSet.close();} catch (error) {console.error('Query data failed:', error);} finally {await database.close();}
}

4. 数据安全

4.1 防止 SQL 注入

在执行 SQL 语句时,使用参数化查询,避免直接拼接用户输入的数据,防止 SQL 注入攻击。例如:

async function queryDataByCondition(database, name) {const querySql = 'SELECT * FROM myTable WHERE name = ?';const resultSet = await database.querySql(querySql, [name]);// 处理结果集
}

4.2 数据加密

对于敏感数据,可以考虑在存储到数据库之前进行加密处理,提高数据的安全性。例如,使用加密算法对用户密码进行加密存储:

import { Crypto } from '@ohos.security.crypto';function encryptData(data) {const cipher = Crypto.createCipher('AES/GCM/NoPadding');const key = Crypto.generateKey('AES', 256);cipher.init('encrypt', key);return cipher.update(data);
}async function insertEncryptedData(database, password) {const encryptedPassword = encryptData(password);const insertSql = 'INSERT INTO users (password) VALUES (?)';await database.executeSql(insertSql, [encryptedPassword]);
}

5. 异步操作与并发控制

5.1 异步操作

ArkData 的操作大多是异步的,要合理使用 async/awaitPromise 来处理异步操作,避免阻塞主线程。例如:

async function performAsyncOperations() {const database = await initDatabase();const result = await database.querySql('SELECT * FROM myTable');// 处理查询结果
}

5.2 并发控制

当多个任务同时访问数据库时,要考虑并发控制,避免数据冲突。可以使用事务来保证数据的一致性,例如:

async function concurrentOperation(database) {await database.beginTransaction();try {// 执行多个数据库操作await database.executeSql('UPDATE myTable SET column1 = ? WHERE id = ?', ['newValue', 1]);await database.executeSql('DELETE FROM myTable WHERE id = ?', [2]);await database.commitTransaction();} catch (error) {await database.rollbackTransaction();console.error('Concurrent operation failed:', error);}
}

优化ArkData的数据库操作性能

在鸿蒙开发中,使用 ArkData 进行数据库操作时,可以通过以下多种方式来优化性能:

1. 数据库设计优化

1.1 合理设计表结构

  • 字段选择:仅存储必要的数据字段,避免存储过多冗余信息,以减少磁盘 I/O 和内存占用。例如,在用户信息表中,如果不需要存储用户的历史登录 IP 地址,就不要添加该字段。
  • 数据类型选择:选择合适的数据类型,尽量使用占用空间小的数据类型。例如,对于年龄字段,使用 INTEGER 而不是 TEXT 类型。
-- 正确示例,使用合适的数据类型
CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,age INTEGER
);

1.2 建立合适的索引

  • 选择索引列:对经常用于查询条件、排序和连接操作的列创建索引。例如,在用户表中,如果经常根据用户名进行查询,就可以为 name 列创建索引。
async function createIndex(database) {const createIndexSql = 'CREATE INDEX idx_name ON users (name)';await database.executeSql(createIndexSql);
}
  • 避免过多索引:虽然索引可以加快查询速度,但过多的索引会增加插入、更新和删除操作的开销,同时也会占用更多的磁盘空间。

2. 批量操作优化

2.1 批量插入数据

当需要插入大量数据时,使用批量插入可以显著减少数据库的事务开销。可以将多条插入语句合并为一个事务进行处理。

async function batchInsertData(database) {const insertSql = 'INSERT INTO users (name, age) VALUES (?, ?)';const dataToInsert = [['John', 25],['Jane', 30],// 更多数据...];await database.beginTransaction();try {for (const values of dataToInsert) {await database.executeSql(insertSql, values);}await database.commitTransaction();} catch (error) {await database.rollbackTransaction();console.error('Batch insert failed:', error);}
}

2.2 批量更新和删除

类似地,对于大量的更新和删除操作,也可以采用批量处理的方式,将多个操作合并到一个事务中。

async function batchUpdateData(database) {const updateSql = 'UPDATE users SET age = age + 1 WHERE age < ?';const values = [30];await database.beginTransaction();try {await database.executeSql(updateSql, values);await database.commitTransaction();} catch (error) {await database.rollbackTransaction();console.error('Batch update failed:', error);}
}

3. 查询优化

3.1 避免全表扫描

  • 使用索引:确保查询语句中使用了合适的索引,避免全表扫描。例如,使用 WHERE 子句指定索引列进行查询。
async function queryDataWithIndex(database) {const querySql = 'SELECT * FROM users WHERE name = ?';const values = ['John'];const resultSet = await database.querySql(querySql, values);// 处理结果集
}
  • 优化查询条件:尽量减少 OR 操作符的使用,因为 OR 操作可能会导致数据库无法使用索引。可以将 OR 条件拆分成多个查询,然后合并结果。

3.2 只查询需要的字段

避免使用 SELECT *,只选择需要的字段,减少数据传输和处理的开销。

async function querySpecificFields(database) {const querySql = 'SELECT name, age FROM users WHERE age > ?';const values = [20];const resultSet = await database.querySql(querySql, values);// 处理结果集
}

4. 资源管理优化

4.1 及时关闭连接和结果集

在完成数据库操作后,及时关闭数据库连接和结果集,释放资源。

async function queryData() {const database = await initDatabase();try {const querySql = 'SELECT * FROM users';const resultSet = await database.querySql(querySql);while (await resultSet.goToNextRow()) {// 处理结果集数据}await resultSet.close();} catch (error) {console.error('Query data failed:', error);} finally {await database.close();}
}

4.2 减少频繁打开和关闭数据库连接

尽量复用数据库连接,避免频繁地打开和关闭数据库连接,因为这会带来额外的开销。可以在应用启动时打开数据库连接,在应用关闭时关闭连接。

5. 缓存机制

5.1 内存缓存

对于一些频繁访问且不经常变化的数据,可以使用内存缓存来减少数据库查询次数。例如,使用 JavaScript 对象来缓存查询结果。

const dataCache = {};async function getCachedData(database, key) {if (dataCache[key]) {return dataCache[key];}const querySql = `SELECT * FROM myTable WHERE id = ?`;const resultSet = await database.querySql(querySql, [key]);if (await resultSet.goToNextRow()) {const data = await resultSet.getRowObject();dataCache[key] = data;return data;}return null;
}

5.2 合理设置缓存更新策略

当数据库中的数据发生变化时,要及时更新缓存,以保证数据的一致性。可以在数据插入、更新或删除操作后,清除相应的缓存。

监控ArkData在鸿蒙开发中的数据库操作性能

在鸿蒙开发中,监控 ArkData 数据库操作性能对于优化应用至关重要。以下为你详细介绍一些监控数据库操作性能的方法:

1. 日志记录

1.1 记录操作时间

在执行数据库操作前后记录时间戳,通过计算时间差来衡量操作的执行时间。这种方法简单直观,能快速定位耗时较长的操作。

import { Database, DatabaseConfig } from '@ohos.data.arkdata';async function monitorQueryPerformance() {const config: DatabaseConfig = {name: 'myDatabase.db',securityLevel: 1};const database = await Database.open(config);// 记录开始时间const startTime = Date.now();const querySql = 'SELECT * FROM myTable';const resultSet = await database.querySql(querySql);// 记录结束时间const endTime = Date.now();const executionTime = endTime - startTime;console.log(`Query operation took ${executionTime} milliseconds.`);await resultSet.close();await database.close();
}

1.2 记录操作内容

除了时间,还可以记录具体的 SQL 语句和参数,方便后续分析问题。例如,在执行 executeSql 方法时,记录相关信息。

async function logDatabaseOperation(database, sql, params) {console.log(`Executing SQL: ${sql}, with params: ${JSON.stringify(params)}`);const startTime = Date.now();await database.executeSql(sql, params);const endTime = Date.now();const executionTime = endTime - startTime;console.log(`Operation completed in ${executionTime} milliseconds.`);
}

2. 性能分析工具

2.1 DevEco Studio 性能分析器

  • 功能介绍:DevEco Studio 提供了强大的性能分析器,可以对应用的 CPU、内存、磁盘 I/O 等进行全面监控。在运行应用时,通过性能分析器可以查看数据库操作相关的性能指标。
  • 操作步骤
    1. 打开 DevEco Studio,运行应用。
    2. 点击菜单栏中的“Run” -> “Profile”,选择要分析的应用进程。
    3. 在性能分析器中,可以查看 CPU 使用率、内存占用情况等,通过分析数据库操作的 CPU 时间和 I/O 时间,找出性能瓶颈。

2.2 SQLite 内置分析工具

  • EXPLAIN QUERY PLAN:用于分析 SQL 查询语句的执行计划,帮助了解数据库是如何执行查询的,是否使用了索引等。
async function analyzeQueryPlan(database) {const querySql = 'SELECT * FROM myTable WHERE id = 1';const explainSql = `EXPLAIN QUERY PLAN ${querySql}`;const resultSet = await database.querySql(explainSql);while (await resultSet.goToNextRow()) {const plan = await resultSet.getRowObject();console.log('Query plan:', plan);}await resultSet.close();
}
  • ANALYZE:更新数据库的统计信息,使查询优化器能够生成更优的执行计划。
async function updateStatistics(database) {await database.executeSql('ANALYZE');
}

3. 指标监控与可视化

3.1 自定义指标监控

定义一些关键的性能指标,如查询响应时间、插入操作的吞吐量等,并定期收集这些指标。

const queryResponseTimes = [];async function monitorQueryResponseTime(database) {const startTime = Date.now();const querySql = 'SELECT * FROM myTable';await database.querySql(querySql);const endTime = Date.now();const responseTime = endTime - startTime;queryResponseTimes.push(responseTime);console.log(`Query response time: ${responseTime} ms`);
}

3.2 可视化展示

使用第三方库或工具将收集到的性能指标进行可视化展示,如使用 Echarts 库绘制折线图来展示查询响应时间的变化趋势。

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Database Performance Visualization</title><!-- 引入 Echarts 库 --><script src="https://cdn.jsdelivr.net/npm/echarts@5.4.2/dist/echarts.min.js"></script>
</head><body><!-- 定义图表容器 --><div id="main" style="width: 600px;height:400px;"></div><script>// 模拟从应用中获取的查询响应时间数据const queryResponseTimes = [10, 20, 15, 25, 30];// 初始化图表const myChart = echarts.init(document.getElementById('main'));// 配置图表选项const option = {xAxis: {type: 'category',data: ['Query 1', 'Query 2', 'Query 3', 'Query 4', 'Query 5']},yAxis: {type: 'value'},series: [{data: queryResponseTimes,type: 'line'}]};// 使用配置项显示图表myChart.setOption(option);</script>
</body></html>

4. 压力测试

4.1 模拟高并发场景

使用压力测试工具,如 Apache JMeter 或 Gatling,模拟大量并发用户对数据库进行操作,观察数据库在高负载下的性能表现。

4.2 分析测试结果

通过压力测试结果,分析数据库的吞吐量、响应时间、错误率等指标,找出性能瓶颈和可能出现的问题。例如,如果在高并发场景下查询响应时间过长,可能需要优化查询语句或增加索引。

最后

以上就是 V 哥整理的在HarmonyOS NEXT开发中的 ArkData 操作 SQLite数据库的相关知识,希望可以帮助大家快速掌握鸿蒙开发的数据库应用,关注威哥爱编程,鸿蒙开发同前行。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

viewport meta 标记

在移动端网页开发中,viewport meta 标记是优化显示效果的关键。它定义了浏览器可视区域的宽度和缩放比例,常用于适配不同设备屏幕。 默认情况下,移动浏览器会将网页放入一个虚拟的 viewport(如 980px),然后缩放到设备屏幕(如 375px),导致内容显得很小。例如,一个宽度…

如何用Forest方便快捷地在SpringBoot项目中对接DeepSeek

​一. 环境要求JDK 8 / 17SpringBoot 2.x / 3.xForest 1.6.4+Fastjson2依赖配置 除了 SpringBoot 和 Lombok 等基础框架之外,再加上 Forest 和 Fastjson2 的依赖<!-- Forest框架 --> <dependency><groupId>com.dtflys.forest</groupId><artifactId…

5. MySQL 存储引擎(详解说明)

5. MySQL 存储引擎(详解说明) @目录5. MySQL 存储引擎(详解说明)1. 查看存储引擎2. 设置系统默认的存储引擎3. 设置表的存储引擎3.1 创建表时指定存储引擎3.2 修改表的存储引擎4. 引擎介绍4.1 InnoDB 引擎:具备外键支持功能的事务存储引擎4.2 MyISAM 引擎:主要的非事务处…

130道基础OJ编程题之: 68~77

130道基础OJ编程题之: 68~77 @目录130道基础OJ编程题之: 68~7768:BC72 平均身高69:BC74 HTTP状态码70:BC75 数字三角形71:BC76 公务员面试72:BC77 有序序列插入一个数73:BC78 筛选法求素数74: BC79 图像相似度75: BC80 登录验证76: BC85 包含数字9的数77:BC86 奇偶统计最后:68…

如何选择既能支持稳定传输 又适配信创环境的文件传输系统?

在日常工作开展中,财政局作为政府单位中负责财政收支、预算管理和财务监督的重要部门,在文件传输方面存在多种场景及需求。财政局会存在与其他政府部门间协作,向上级财政部门传输文件以及财政局各部门间传输预算报告、财务报告等场景,需要实现快速、准确的流转。财政局一般…

本地新建js公用库组件并打包发布到npm仓库详细说明

有时候,我们想在本地开发一个公用js函数组件库,并上传到npm仓库供开发者使用,本文就详细介绍了从新建本地项目到发布至npm仓库的整过过程,供大家学习!1、注册账号 首先我们去npm官网注册一个账号,注册成功后请牢记账号和密码。 需要注意的是,现在npm登录好像启用了双因素…

51CTO:《DeepSeek入门宝典(全4册)》 - 官方完整版 - PDF免费下载

由51CTO智能研究院、51CTO传媒、51CTO学堂联合倾力打造了这份《DeepSeek入门宝典》,这份DeepSeek宝典共分为四册:《技术解析篇》、《开发实战篇》、《个人使用篇》、《行业应用篇》,长达80余页。它涵盖了技术解析、开发实战、个人使用以及行业应用等多个维度,是帮助每一位通…

Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!

在众多开源项目中,高颜值、功能强大且部署简单的项目往往更能俘获开发者的心。然而,实际部署 Web 应用时,面对数据库、缓存、消息队列等复杂的依赖关系,常常令人头疼。Docker 的开源为我们普及了容器化技术,能够快速打包和部署 Web 应用,让一切变得轻松简单。但当你从开发…

到底是谁还没搞清楚 OMS 和 WMS的区别?

聊到 OMS(订单管理系统) 和 WMS(仓库管理系统),很多人第一反应是:“不就是订单和仓库嘛?谁还分不清?” 但等到真正操作的时候,很多企业就开始搞混了:“WMS 不是也能管库存吗?为什么还要 OMS?” “OMS 负责订单,那 WMS 发货的时候为啥还要管订单?” “库存到底是 …

VMware ESXi 8.0U2d macOS Unlocker OEM BIOS 标准版和厂商定制版

VMware ESXi 8.0U2d macOS Unlocker & OEM BIOS 标准版和厂商定制版VMware ESXi 8.0U2d macOS Unlocker & OEM BIOS 标准版和厂商定制版 ESXi 8.0U2 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日立)、Fujitsu (富士通)、…

当AI学会“读心”,浙大DeepSeek第三期掌握AI分布式学习,多场景下的「超级外挂」!

当AI学会“读心”,浙大DeepSeek第三期掌握AI分布式学习,多场景下的「超级外挂」!"当AI不仅能写诗画画,还能参与社会治理,我们的世界会变成什么样?"最近浙大的DeepSeek公开课第三期,直接把这个问题抛给了大众。这场线上讲座一边拆解大模型的技术内核、展示如何…

SecureCRT报错--文件名目录名或卷标语法不正确

SecureCRT版本:Version 7.0.0 (build 326)绿色版 1.错误展示2.解决办法 删除C:\Users\Administrator\AppData\Roaming\SecureCRT.dmp后重新解压