鸿蒙开发新手指南:ArkData入门到实战,掌握数据持久化核心技巧之用户首选项
ArkData作为HarmonyOS开发的关键框架,为开发者提供了轻量化、高性能的本地数据持久化解决方案,彻底告别传统开发的复杂存储逻辑!无论是需要快速记录用户偏好设置(如主题颜色、语言选项),还是处理复杂的关系型数据(如用户账单、社交应用动态),ArkData都能通过**用户首选项(Preferences)和关系型数据库(RelationalStore)**两大模块,实现秒级响应与安全存储。本文
在鸿蒙生态中,高效的数据管理能力是构建流畅应用体验的核心。ArkData作为HarmonyOS开发的关键框架,为开发者提供了轻量化、高性能的本地数据持久化解决方案,彻底告别传统开发的复杂存储逻辑!
无论是需要快速记录用户偏好设置(如主题颜色、语言选项),还是处理复杂的关系型数据(如用户账单、社交应用动态),ArkData都能通过**用户首选项(Preferences)和关系型数据库(RelationalStore)**两大模块,实现秒级响应与安全存储。本文将从零开始拆解ArkData的核心功能,通过代码实战对比两种方案的适用场景,助你快速掌握鸿蒙数据管理的精髓,轻松应对轻量化应用与复杂业务需求的双重挑战!
快捷跳转
一、引言:为什么鸿蒙开发者需要ArkData?

数据存储与管理
ArkData 提供多种数据存储方式,包括用户首选项、键值型数据库和关系型数据库,满足不同数据特点的持久化需求。所有应用创建的数据库均保存在应用沙盒中,确保数据隔离与安全。当应用卸载时,相关数据库会自动删除,避免数据残留。
数据标准化
ArkData 支持 HarmonyOS 的标准化数据定义,提供跨应用、跨设备的统一数据类型和数据结构标准。这种标准化设计有助于实现数据在不同设备和应用之间的无缝共享与交互。
数据管理能力
ArkData 提供高效的数据管理功能,包括权限管理、数据备份与恢复以及数据共享框架。这些功能确保数据的安全性、可靠性和可维护性,同时支持多用户环境下的数据访问控制。
数据同步
ArkData 支持跨设备数据同步,通过分布式对象和分布式数据库技术,实现内存对象和数据库的跨设备共享与访问。例如,联系人信息可以在手机和手表之间同步,确保数据的一致性和实时性。
安全与可靠性
ArkData 强调数据的安全性和可靠性,通过沙盒机制、权限管理和数据备份恢复等功能,确保数据在存储、管理和同步过程中的安全与完整。### 数据存储与管理
ArkData 提供多种数据存储方式,包括用户首选项、键值型数据库和关系型数据库,满足不同数据特点的持久化需求。所有应用创建的数据库均保存在应用沙盒中,确保数据隔离与安全。当应用卸载时,相关数据库会自动删除,避免数据残留。
二、用户首选项实现数据持久化
介绍
用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据,适用的场景一般为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等
运作机制
用户首选项运作机制如下:

代码使用
官方案例中代码过于代码,我会通过一个demo来展示
我们会模拟一个夜间模式的个性化功能实现,最终效果如下:
案例展示
这里可以和与下方页面效果展示,进行对比
页面实现
实现页面后效果如下,大家可以与上面的案例展示进行对比观看,看看没有实现首选项功能的区别
代码如下,具体逻辑可以看注释:
@Entry
@Component
struct Index {
@State isDark: boolean = false; // 是否是夜间模式
build() {
Column() {
Row(){
Text("夜间模式") // 夜间模式按钮提示
//如果为夜间模式,背景为黑,那么文字颜色就设为白色反之为黑
.fontColor(this.isDark ? "#fff" : "#000")
//使用了切换按钮组件Toggle
Toggle({ type: ToggleType.Switch, isOn: false })
.onChange((isOn) => { //可以绑定onChange事件来响应操作后的自定义行为
this.isDark = isOn;
})
}
.width('100%') // 宽度100%
.padding(10) //内边距10
.margin(10) //外边距10
.justifyContent(FlexAlign.Center) // 水平居中
.borderRadius(10) // 设置边框为圆角
.borderWidth(1) // 设置边框宽度为1
.borderColor("#666") // 设置边框颜色为灰色
}
.height('100%')
.width('100%')
//如果为夜间模式,背景为黑,反之为白色
.backgroundColor(this.isDark ? "#000" : "#fff")
}
}
页面组件生命周期的了解
接下来实现用户首选项,在我们实现该功能前,最好了解一下鸿蒙相关的生命周期,来辅助我们实现这个功能
鸿蒙官方的讲解:自定义组件的生命周期

我们主要关注这两个回调函数,在我们实现个性化数据时,我们关闭或离开个性化页面前,需要保存我们的个性化设置。在我们重新进入页面时,要重新加载我们持久化的配置,这时要使用到onPageShow和onPageHide

实现保存用户首选项功能
实现保存首选项功能一共三步,这里我以退出时保存首选项设置为例:
1. 获取首选项实例对象

调用getPreferencesSync方法,需要传入两个参数
一个是上下文环境,另一个是Preferences实例相关的配置选项。,需要指定name或者组id
2.保存首选项设置

3.持久化数据

onPageHide(): void {
// 退出应用时,保存当前应用设置
// 1.创建首选项对象
let preference = preferences.getPreferencesSync(this.context,{name: "isdark"})
//context 为上下文环境, 在页面中可以通过getContext(this)获取, 我们在上面使用了common.UIAbilityContext,这个是上下文的父类,使用更广泛
//第二个参数是Preferences实例相关的配置选项。,需要指定name或者组id, 如果指定了name,则表示该首选项是单独的,如果指定了groupId,则表示该首选项是属于某个组的
// 2.保存首选项设置
preference.put("isDark",this.isDark)
// 3.持久化数据
preference.flush()
}
实现读取用户首选项功能

onPageShow(): void {
// 获取当前应用是否处于夜间模式下
// 1.创建首选项对象
let preference = preferences.getPreferencesSync(this.context,{name: "isdark"})
// 2.获取首选项设置
this.isDark = preference.getSync("isDark", true) as boolean
}
三、完整代码展示
import { preferences } from '@kit.ArkData';
import { common } from '@kit.AbilityKit';
@Entry
@Component
struct Index {
@State isDark: boolean = false;
private context:common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
onPageShow(): void {
// 获取当前应用是否处于夜间模式下
// 1.创建首选项对象
let preference = preferences.getPreferencesSync(this.context,{name: "isdark"})
// 2.获取首选项设置
this.isDark = preference.getSync("isDark", true) as boolean
}
onPageHide(): void {
// 退出应用时,保存当前应用设置
// 1.创建首选项对象
let preference = preferences.getPreferencesSync(this.context,{name: "isdark"})
//context 为上下文环境, 在页面中可以通过getContext(this)获取, 我们在上面使用了common.UIAbilityContext,这个是上下文的父类,使用更广泛
//第二个参数是Preferences实例相关的配置选项。,需要指定name或者组id, 如果指定了name,则表示该首选项是单独的,如果指定了groupId,则表示该首选项是属于某个组的
// 2.保存首选项设置
preference.put("isDark",this.isDark)
// 3.持久化数据
preference.flush()
}
build() {
Column() {
Row(){
Text("夜间模式")
.fontColor(this.isDark ? "#fff" : "#000")
Toggle({ type: ToggleType.Switch, isOn: false })
.onChange((isOn) => {
this.isDark = isOn;
})
}
.width('100%')
.padding(10)
.margin(10)
.justifyContent(FlexAlign.Center)
.borderRadius(10)
.borderWidth(1)
.borderColor("#666")
}
.height('100%')
.width('100%')
.backgroundColor(this.isDark ? "#000" : "#fff")
}
}
更多推荐


所有评论(0)