HarmonyOS NEXT:保存应用数据

用户首选项使用

用户首选项的特点

数据体积小、访问频率高、有加载速度要求的数据如用户偏好设置、用户字体大小、应用的配置参数。

用户搜选项(Preferences)提供了轻量级配置数据的持久化能力,支持订阅数据变化的通知能力。不支持分布式同步。

基于Key-Value的数据结构,Key是不重复的关键字,Value是数据值。

Preferences是一种非关系型数据库,不遵循数据库的ACID特性,数据见毫无关系。

用户首选项存储在内存中,存储数据量过大会导致应用占用内存过多。如果需要持久化存储,可以调用Flush接口。

不支持数据加密。

用户首选项使用场景

应用配置参数、用户偏好设置,如应用字体大小个性化调整、主题颜色等。

用户首选项机制原理

用户首选项实际通过持久化文件的形式存储在应用沙箱目录中,ArkTS提供交互接口。每个持久化文件唯一关联一个实例。

用户程序通过UIAbilityContext来获得Preferences实例。 因为一个程序可以有多个UIAbility,所以可以获得多个Preferences实例。

用户首选项主要API

preferences.getPreferencesSync10+

getPreferencesSync(context: Context, options: Options): Preferences

获取Preferences实例,此为同步接口。

参数:

参数名类型必填说明
contextContext

应用上下文。

FA模型的应用Context定义见Context。

Stage模型的应用Context定义见Context。

optionsOptions与Preferences实例相关的配置选项。

返回值:

类型说明
Preferences返回Preferences实例。

示例代码: 

import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';let dataPreferences: preferences.Preferences | null = null;class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {let options: preferences.Options = { name: 'myStore' };dataPreferences = preferences.getPreferencesSync(this.context, options);}
}
putSync10+

putSync(key: string, value: ValueType): void

将数据写入缓存的Preferences实例中,可通过flush将Preferences实例持久化,此为同步接口。

参数:

参数名类型必填说明
keystring要修改的存储的Key,不能为空。
valueValueType存储的新值。

示例代码: 

dataPreferences.putSync('startup', 'auto');
// 当字符串有特殊字符时,需要将字符串转为Uint8Array类型再存储
let uInt8Array1 = new util.TextEncoder().encodeInto("~!@#¥%……&*()——+?");
dataPreferences.putSync('uInt8', uInt8Array1);
hasSync10+

hasSync(key: string): boolean

检查缓存的Preferences实例中是否包含名为给定Key的存储键值对,此为同步接口。

参数:

参数名类型必填说明
keystring要检查的存储key名称,不能为空。

返回值:

类型说明
boolean返回Preferences实例是否包含给定key的存储键值对,true表示存在,false表示不存在。

示例代码: 

let isExist: boolean = dataPreferences.hasSync('startup');
if (isExist) {console.info("The key 'startup' is contained.");
} else {console.info("The key 'startup' dose not contain.");
}
getSync10+

getSync(key: string, defValue: ValueType): ValueType

从缓存的Preferences实例中获取键对应的值,如果值为null或者非默认值类型,返回默认数据defValue,此为同步接口。

参数:

参数名类型必填说明
keystring要获取的存储Key名称,不能为空。
defValueValueType默认返回值。

返回值:

类型说明
ValueType返回键对应的值。

示例代码: 

let value: preferences.ValueType = dataPreferences.getSync('startup', 'default');
deleteSync10+

deleteSync(key: string): void

从缓存的Preferences实例中删除名为给定Key的存储键值对,可通过flush将Preferences实例持久化,此为同步接口。

参数:

参数名类型必填说明
keystring要删除的存储key名称,不能为空。

示例代码: 

dataPreferences.deleteSync('startup');
flush

flush(callback: AsyncCallback<void>): void

将缓存的Preferences实例中的数据异步存储到用户首选项的持久化文件中,使用callback异步回调。

参数:

参数名类型必填说明
callbackAsyncCallback<void>

示例代码: 

import { BusinessError } from '@kit.BasicServicesKit';dataPreferences.flush((err: BusinessError) => {if (err) {console.error("Failed to flush. code =" + err.code + ", message =" + err.message);return;}console.info("Succeeded in flushing.");
})
let promise = dataPreferences.flush();
promise.then(() => {console.info("Succeeded in flushing.");
}).catch((err: BusinessError) => {console.error("Failed to flush. code =" + err.code + ", message =" + err.message);
})
on('change')

on(type: 'change', callback: Callback<string>): void

订阅数据变更,订阅的Key的值发生变更后,在执行flush方法后,触发callback回调。

当调用removePreferencesFromCache或者deletePreferences后,订阅的数据变更会主动取消订阅,在重新getPreferences后需要重新订阅数据变更。

参数:

参数名类型必填说明
typestring事件类型,固定值'change',表示数据变更。
callbackCallback<string>回调函数。

示例代码:

let observer = (key: string) => {console.info('The key' + key + 'changed.');
}
dataPreferences.on('change', observer);
// 数据产生变更,由'auto'变为'manual'
dataPreferences.put('startup', 'manual', (err: BusinessError) => {if (err) {console.error(`Failed to put the value of 'startup'. Code:${err.code},message:${err.message}`);return;}console.info("Succeeded in putting the value of 'startup'.");if (dataPreferences !== null) {dataPreferences.flush((err: BusinessError) => {if (err) {console.error(`Failed to flush. Code:${err.code}, message:${err.message}`);return;}console.info('Succeeded in flushing.');})}
})
on('dataChange')12+

on(type: 'dataChange', keys: Array<string>, callback: Callback<Record<string, ValueType>>): void

精确订阅数据变更,只有被订阅的key值发生变更后,在执行flush方法后,触发callback回调。

参数:

参数名类型必填说明
typestring事件类型,固定值'dataChange',表示精确的数据变更。
keysArray<string>需要订阅的key集合。
callbackCallback<Record<string, ValueType>>回调函数。回调支持返回多个键值对,其中键为发生变更的订阅key,值为变更后的数据:支持number、string、boolean、Array<number>、Array<string>、Array<boolean>、Uint8Array、object类型。
import { BusinessError } from '@kit.BasicServicesKit';let observer = (data: Record<string, preferences.ValueType>) => {for (const keyValue of Object.entries(data)) {console.info(`observer : ${keyValue}`)}console.info("The observer called.")
}
let keys = ['name', 'age']
dataPreferences.on('dataChange', keys, observer);
dataPreferences.putSync('name', 'xiaohong');
dataPreferences.putSync('weight', 125);
dataPreferences.flush((err: BusinessError) => {if (err) {console.error("Failed to flush. Cause: " + err);return;}console.info("Succeeded in flushing.");
})
off('change')

off(type: 'change', callback?: Callback<string>): void

取消订阅数据变更。

参数:

参数名类型必填说明
typestring事件类型,固定值'change',表示数据变更。
callbackCallback<string>

示例代码:

import { BusinessError } from '@kit.BasicServicesKit';let observer = (key: string) => {console.info("The key " + key + " changed.");
}
dataPreferences.on('change', observer);
dataPreferences.putSync('startup', 'auto');
dataPreferences.flush((err: BusinessError) => {if (err) {console.error("Failed to flush. Cause: " + err);return;}console.info("Succeeded in flushing.");
})
dataPreferences.off('change', observer);
preferences.deletePreferences10+

deletePreferences(context: Context, options: Options, callback: AsyncCallback<void>): void

从缓存中移出指定的Preferences实例,若Preferences实例有对应的持久化文件,则同时删除其持久化文件。使用callback异步回调。

调用该接口后,不建议再使用旧的Preferences实例进行数据操作,否则会出现数据一致性问题,应将Preferences实例置为null,系统将会统一回收。

不支持该接口与preference其他接口并发调用。

参数:

参数名类型必填说明
contextContext

应用上下文。

FA模型的应用Context定义见Context。

Stage模型的应用Context定义见Context。

optionsOptions与Preferences实例相关的配置选项。
callbackAsyncCallback<void>回调函数。当移除成功,err为undefined,否则为错误对象。

示例代码:

import { UIAbility } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { window } from '@kit.ArkUI';class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {let options: preferences.Options = { name: 'myStore' };preferences.deletePreferences(this.context, options, (err: BusinessError) => {if (err) {console.error("Failed to delete preferences. code =" + err.code + ", message =" + err.message);return;}console.info("Succeeded in deleting preferences.");})}
}

 用户首选项开发流程

 1. 导入模块

import { preferences } from '@kit.ArkData';

2. 获取preferences实例

import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';let dataPreferences: preferences.Preferences | null = null;class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {let options: preferences.Options = { name: 'myStore' };dataPreferences = preferences.getPreferencesSync(this.context, options);}
}

3. 保存数据

dataPreferences.putSync('startup', 'auto');

4. 读取数据

dataPreferences.getSync('startup', 'default');

5. 数据持久化

import { BusinessError } from '@kit.BasicServicesKit';dataPreferences.flush((err: BusinessError) => {if (err) {console.error("Failed to flush. code =" + err.code + ", message =" + err.message);return;}console.info("Succeeded in flushing.");
})

用户首选项开发实践

用户首选项开发实践文档华为开发者学堂https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717498132814493

关系型数据库使用 

关系型数据库简介

关系型数据库基于SQLite组件,适用于存储包含复杂关系数据的场景。关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。

 关系型数据库主要API

relationalStore.getRdbStore

getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback<RdbStore>): void

获得一个相关的RdbStore,操作关系型数据库,用户可以根据自己的需求配置RdbStore的参数,然后通过RdbStore调用相关接口可以执行相关的数据操作,使用callback异步回调。

当用非加密方式打开一个已有的加密数据库时,会返回错误码14800011,表示数据库损坏。此时用加密方式可以正常打开该数据库。

getRdbStore目前不支持多线程并发操作。

参数:

参数名类型必填说明
contextContext

应用的上下文。

FA模型的应用Context定义见Context。

Stage模型的应用Context定义见Context。

configStoreConfig与此RDB存储相关的数据库配置。
callbackAsyncCallback<RdbStore>指定callback回调函数,返回RdbStore对象。
示例代码:
import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';let store: relationalStore.RdbStore | undefined = undefined;class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {const STORE_CONFIG: relationalStore.StoreConfig = {name: "RdbTest.db",securityLevel: relationalStore.SecurityLevel.S1};relationalStore.getRdbStore(this.context, STORE_CONFIG, (err: BusinessError, rdbStore: relationalStore.RdbStore) => {store = rdbStore;if (err) {console.error(`Get RdbStore failed, code is ${err.code},message is ${err.message}`);return;}console.info('Get RdbStore successfully.');})}
}
executeSql10+

executeSql(sql: string, callback: AsyncCallback<void>):void

执行包含指定参数但不返回值的SQL语句,语句中的各种表达式和操作符之间的关系操作符号不超过1000个,使用callback异步回调。

此接口不支持执行查询、附加数据库和事务操作,可以使用querySql、query、attach、beginTransaction、commit等接口代替。

不支持分号分隔的多条语句。

参数:

参数名类型必填说明
sqlstring指定要执行的SQL语句。
callbackAsyncCallback<void>指定callback回调函数。

示例代码:

const SQL_DELETE_TABLE = "DELETE FROM test WHERE name = 'zhangsan'"if(store != undefined) {(store as relationalStore.RdbStore).executeSql(SQL_DELETE_TABLE, (err) => {if (err) {console.error(`ExecuteSql failed, code is ${err.code},message is ${err.message}`);return;}console.info('Delete table done.');})
}
insert

insert(table: string, values: ValuesBucket, callback: AsyncCallback<number>):void

向目标表中插入一行数据,使用callback异步回调。由于共享内存大小限制为2Mb,因此单条数据的大小需小于2Mb,否则会查询失败。

参数:

参数名类型必填说明
tablestring指定的目标表名。
valuesValuesBucket表示要插入到表中的数据行。
callbackAsyncCallback<number>指定callback回调函数。如果操作成功,返回行ID;否则返回-1。

 示例代码:

let value1 = "Lisa";
let value2 = 18;
let value3 = 100.5;
let value4 = new Uint8Array([1, 2, 3, 4, 5]);// 以下三种方式可用
const valueBucket1: relationalStore.ValuesBucket = {'NAME': value1,'AGE': value2,'SALARY': value3,'CODES': value4,
};
const valueBucket2: relationalStore.ValuesBucket = {NAME: value1,AGE: value2,SALARY: value3,CODES: value4,
};
const valueBucket3: relationalStore.ValuesBucket = {"NAME": value1,"AGE": value2,"SALARY": value3,"CODES": value4,
};if(store != undefined) {(store as relationalStore.RdbStore).insert("EMPLOYEE", valueBucket1, (err: BusinessError, rowId: number) => {if (err) {console.error(`Insert is failed, code is ${err.code},message is ${err.message}`);return;}console.info(`Insert is successful, rowId = ${rowId}`);})
}
update

update(values: ValuesBucket, predicates: RdbPredicates, callback: AsyncCallback<number>):void

根据RdbPredicates的指定实例对象更新数据库中的数据,使用callback异步回调。由于共享内存大小限制为2Mb,因此单条数据的大小需小于2Mb,否则会查询失败。

参数:

参数名类型必填说明
valuesValuesBucketvalues指示数据库中要更新的数据行。键值对与数据库表的列名相关联。
predicatesRdbPredicatesRdbPredicates的实例对象指定的更新条件。
callbackAsyncCallback<number>指定的callback回调方法。返回受影响的行数。

 示例代码:

let value1 = "Rose";
let value2 = 22;
let value3 = 200.5;
let value4 = new Uint8Array([1, 2, 3, 4, 5]);// 以下三种方式可用
const valueBucket1: relationalStore.ValuesBucket = {'NAME': value1,'AGE': value2,'SALARY': value3,'CODES': value4,
};
const valueBucket2: relationalStore.ValuesBucket = {NAME: value1,AGE: value2,SALARY: value3,CODES: value4,
};
const valueBucket3: relationalStore.ValuesBucket = {"NAME": value1,"AGE": value2,"SALARY": value3,"CODES": value4,
};let predicates = new relationalStore.RdbPredicates("EMPLOYEE");
predicates.equalTo("NAME", "Lisa");
if(store != undefined) {(store as relationalStore.RdbStore).update(valueBucket1, predicates,(err, rows) => {if (err) {console.error(`Updated failed, code is ${err.code},message is ${err.message}`);return;}console.info(`Updated row count: ${rows}`);})
}

delete

delete(predicates: RdbPredicates, callback: AsyncCallback<number>):void

根据RdbPredicates的指定实例对象从数据库中删除数据,使用callback异步回调。

参数:

参数名类型必填说明
predicatesRdbPredicatesRdbPredicates的实例对象指定的删除条件。
callbackAsyncCallback<number>指定callback回调函数。返回受影响的行数。

 示例代码:

let predicates = new relationalStore.RdbPredicates("EMPLOYEE");
predicates.equalTo("NAME", "Lisa");
if(store != undefined) {(store as relationalStore.RdbStore).delete(predicates, (err, rows) => {if (err) {console.error(`Delete failed, code is ${err.code},message is ${err.message}`);return;}console.info(`Delete rows: ${rows}`);})
}
query10+

query(predicates: RdbPredicates, callback: AsyncCallback<ResultSet>):void

根据指定条件查询数据库中的数据,使用callback异步回调。由于共享内存大小限制为2Mb,因此单条数据的大小需小于2Mb,否则会查询失败。

参数:

参数名类型必填说明
predicatesRdbPredicatesRdbPredicates的实例对象指定的查询条件。
callbackAsyncCallback<ResultSet>指定callback回调函数。如果操作成功,则返回ResultSet对象。
let predicates = new relationalStore.RdbPredicates("EMPLOYEE");
predicates.equalTo("NAME", "Rose");
if(store != undefined) {(store as relationalStore.RdbStore).query(predicates, (err, resultSet) => {if (err) {console.error(`Query failed, code is ${err.code},message is ${err.message}`);return;}console.info(`ResultSet column names: ${resultSet.columnNames}, column count: ${resultSet.columnCount}`);// resultSet是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始。while (resultSet.goToNextRow()) {const id = resultSet.getLong(resultSet.getColumnIndex("ID"));const name = resultSet.getString(resultSet.getColumnIndex("NAME"));const age = resultSet.getLong(resultSet.getColumnIndex("AGE"));const salary = resultSet.getDouble(resultSet.getColumnIndex("SALARY"));console.info(`id=${id}, name=${name}, age=${age}, salary=${salary}`);}// 释放数据集的内存,若不释放可能会引起fd泄露与内存泄露resultSet.close();})
}
relationalStore.deleteRdbStore10+

deleteRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback<void>): void

使用指定的数据库文件配置删除数据库,使用callback异步回调。

删除成功后,建议将数据库对象置为null。若数据库文件处于公共沙箱目录下,则删除数据库时必须使用该接口,当存在多个进程操作同一个数据库的情况,建议向其他进程发送数据库删除通知使其感知并处理。建立数据库时,若在StoreConfig中配置了自定义路径,则必须调用此接口进行删库。 

参数:

参数名类型必填说明
contextContext

应用的上下文。

FA模型的应用Context定义见Context。

Stage模型的应用Context定义见Context。

configStoreConfig与此RDB存储相关的数据库配置。
callbackAsyncCallback<void>指定callback回调函数。

示例代码:

import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';let store: relationalStore.RdbStore | undefined = undefined;class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage){const STORE_CONFIG: relationalStore.StoreConfig = {name: "RdbTest.db",securityLevel: relationalStore.SecurityLevel.S1};relationalStore.deleteRdbStore(this.context, STORE_CONFIG, (err: BusinessError) => {if (err) {console.error(`Delete RdbStore failed, code is ${err.code},message is ${err.message}`);return;}store = undefined;console.info('Delete RdbStore successfully.');})}
}
备份数据库
if (store !== undefined) {// "Backup.db"为备份数据库文件名,默认在RdbStore同路径下备份。也可指定路径:customDir + "backup.db"(store as relationalStore.RdbStore).backup("Backup.db", (err: BusinessError) => {if (err) {console.error(`Failed to backup RdbStore. Code:${err.code}, message:${err.message}`);return;}console.info(`Succeeded in backing up RdbStore.`);})
}
从备份数据库中恢复数据
if (store !== undefined) {(store as relationalStore.RdbStore).restore("Backup.db", (err: BusinessError) => {if (err) {console.error(`Failed to restore RdbStore. Code:${err.code}, message:${err.message}`);return;}console.info(`Succeeded in restoring RdbStore.`);})
}

关系型数据库开发实践 

关系型数据库开发实践华为开发者学堂https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717498132814493 

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

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

相关文章

离散化C++

离散化&#xff08;Discretization&#xff09;是一种将连续数据映射到离散值的技术&#xff0c;常用于将大数据范围压缩到较小范围&#xff0c;例如将数值映射到索引。离散化在算法竞赛中常用于处理数值范围较大但数据量较小的问题&#xff08;如区间问题、统计问题等&#xf…

php的使用及 phpstorm环境部署

php语法 环境搭建&#xff1a;在小皮中新建网站&#xff0c;注意先填写域名再点击选择根目录。 成功创建网站后&#xff0c;打开发现forbidden&#xff0c;因为新建的网站里是空的&#xff0c;需要新建index.php文件----> 在Phpstorm中左上角打开文件&#xff0c;打开那个文…

win10部署本地deepseek-r1,chatbox,deepseek联网(谷歌网页插件Page Assist)

win10部署本地deepseek-r1&#xff0c;chatbox&#xff0c;deepseek联网&#xff08;谷歌网页插件Page Assist&#xff09; 前言一、本地部署DeepSeek-r1step1 安装ollamastep2 下载deepseek-r1step2.1 找到模型deepseek-r1step2.2 cmd里粘贴 后按回车&#xff0c;进行下载 ste…

5.3.2 软件设计原则

文章目录 抽象模块化信息隐蔽与独立性衡量 软件设计原则&#xff1a;抽象、模块化、信息隐蔽。 抽象 抽象是抽出事物本质的共同特性。过程抽象是指将一个明确定义功能的操作当作单个实体看待。数据抽象是对数据的类型、操作、取值范围进行定义&#xff0c;然后通过这些操作对数…

4-图像梯度计算

文章目录 4.图像梯度计算(1)Sobel算子(2)梯度计算方法(3)Scharr与Laplacian算子4.图像梯度计算 (1)Sobel算子 图像梯度-Sobel算子 Sobel算子是一种经典的图像边缘检测算子,广泛应用于图像处理和计算机视觉领域。以下是关于Sobel算子的详细介绍: 基本原理 Sobel算子…

02.05、链表求和

02.05、[中等] 链表求和 1、题目描述 给定两个用链表表示的整数&#xff0c;每个节点包含一个数位。 这些数位是反向存放的&#xff0c;也就是个位排在链表首部。 编写函数对这两个整数求和&#xff0c;并用链表形式返回结果。 2、解题思路 本题要求对两个链表表示的整数…

pyside6-uic form.ui -o ui_form.py 的作用

pyside6-uic form.ui -o ui_form.py 的作用 pyside6-uic form.ui -o ui_form.py 这个命令是用来将 .ui 文件转换为 Python 代码文件的工具。 具体作用&#xff1a; pyside6-uic&#xff1a;这是一个命令行工具&#xff0c;用于将用 Qt Designer 或其他图形界面工具创建的 .ui …

图漾相机-ROS2-SDK-Ubuntu版本编译(新版本)

文章目录 前言1.Camport ROS2 SDK 介绍1.1 Camport ROS2 SDK源文件介绍1.2 Camport ROS2 SDK工作流程1.2.1 包含头文件1.2.2 2 初始化 ROS 2 节点1.2.3 创建节点对象1.2.4 创建发布者对象并实现发布逻辑1.2.5 启动 ROS 2 1.3 ROS2 SDK环境配置与编译1.3.1 Ubuntu 20.04 下ROS2 …

海外问卷调查渠道查:企业经营的利器

一、海外问卷调查的基本概念 市场&#xff1a;市场主要由需求者和供给者组成的一种经济关系&#xff0c;主要是商品和服务的交换的一种方式和手段&#xff0c;市场类型按不同标准来划分。按地域划分&#xff0c;则分为国内市场和国际市场&#xff0c;按照产品类型划分&#xf…

pandas中的str使用方法

在 Pandas 中&#xff0c;str 访问器用于对 Series 或 DataFrame 中的字符串数据进行矢量化操作&#xff0c;使其能够像 Python 的字符串方法一样被调用&#xff0c;但支持对整个列或 Series 进行高效处理。 str 只能用于包含字符串类型的 Series 或 DataFrame 的 string 类型…

向上调整算法(详解)c++

算法流程&#xff1a; 与⽗结点的权值作⽐较&#xff0c;如果⽐它⼤&#xff0c;就与⽗亲交换&#xff1b; 交换完之后&#xff0c;重复 1 操作&#xff0c;直到⽐⽗亲⼩&#xff0c;或者换到根节点的位置 这里为什么插入85完后合法&#xff1f; 我们插入一个85&#xff0c;…

LeetCode题练习与总结:根据二叉树创建字符串--606

一、题目描述 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 "()" 表示&#xff0c;转化后需要省略所有不影响字符串与原始二叉树…

人工智能入门课【手写自注意力机制】

原理 自注意力&#xff08;Self-Attention&#xff09;是一种强大的机制&#xff0c;广泛应用于自然语言处理、计算机视觉等领域&#xff0c;尤其是在Transformer架构中发挥了关键作用。它的核心思想是让模型能够动态地关注输入序列中不同位置之间的关系&#xff0c;从而更好地…

理解 InnoDB 如何处理崩溃恢复

在数据库领域&#xff0c;数据的一致性与可靠性至关重要。InnoDB 存储引擎的崩溃恢复机制是保障数据安全的核心&#xff0c;其中 Doublewrite Buffer 和 Redo Log 发挥着关键作用。下面&#xff0c;我们将详细探讨 InnoDB 从写入到崩溃恢复的全过程。 一、写入流程 修改页面&…

gentoo 中更改$PS1

现象&#xff1a;gentoo linux Xfce桌面&#xff0c;Terminal 终端&#xff0c;当进入很深的目录时&#xff0c;终端提示符会很长&#xff0c;不方便。如下图所示&#xff1a; 故需要修改$PS1 gentoo 默认的 PS1 在 /etc/bash/bashrc .d/10-gentoo-color.bash中定义&a…

安全防护前置

就业概述 网络安全工程师/安全运维工程师/安全工程师 安全架构师/安全专员/研究院&#xff08;数学要好&#xff09; 厂商工程师&#xff08;售前/售后&#xff09; 系统集成工程师&#xff08;所有计算机知识都要会一点&#xff09; 学习目标 前言 网络安全事件 蠕虫病毒--&…

【自然语言处理(NLP)】深度学习架构:Transformer 原理及代码实现

文章目录 介绍Transformer核心组件架构图编码器&#xff08;Encoder&#xff09;解码器&#xff08;Decoder&#xff09; 优点应用代码实现导包基于位置的前馈网络残差连接后进行层规范化编码器 Block编码器解码器 Block解码器训练预测 个人主页&#xff1a;道友老李 欢迎加入社…

wordpress代码结构解析

WordPress 是一个基于 PHP 和 MySQL 的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;广泛用于构建网站和博客。要解析 WordPress 代码&#xff0c;首先需要了解其核心结构、主要文件和常用的函数。以下是 WordPress 代码解析的基本指南&#xff1a; --- ### 1. *…

【Leetcode 每日一题】81. 搜索旋转排序数组 II

问题背景 已知存在一个按非降序排列的整数数组 n u m s nums nums&#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c; n u m s nums nums 在预先未知的某个下标 k ( 0 < k < n u m s . l e n g t h ) k\ (0 < k < nums.length) k (0<k<…

机器学习优化算法:从梯度下降到Adam及其变种

机器学习优化算法&#xff1a;从梯度下降到Adam及其变种 引言 最近deepseek的爆火已然说明&#xff0c;在机器学习领域&#xff0c;优化算法是模型训练的核心驱动力。无论是简单的线性回归还是复杂的深度神经网络&#xff0c;优化算法的选择直接影响模型的收敛速度、泛化性能…