ArkData:首选项——让数据在设备中安全的流动 原创

起梨花月
发布于 2024-11-4 20:20
浏览
1收藏

嘿,小伙伴们!👋 你是否曾想过,我们的手机和电脑里的数据是如何被保存下来的?今天,我们就来聊聊应用数据持久化的那些事儿,一起探索如何让数据在设备间自由旅行,就像拥有了自己的小翅膀一样!🦋

📂 应用数据持久化简介

在数字时代,数据就像是我们的宝藏,而应用数据持久化就是将这些宝藏安全地存放在设备上的魔法。无论是通过文件还是数据库,我们都能将内存中的数据保存下来,让它们变成永恒。💎

HarmonyOS提供了几种典型的数据存储形态,包括用户首选项、键值型数据库和关系型数据库。这些工具就像是不同的魔法盒子,帮助我们根据不同的需求选择合适的存储方式。🧰

🔑 用户首选项:轻量级数据的守护者

想象一下,你的应用需要记住用户的一些小习惯,比如字体大小或者是否开启夜间模式。这时,用户首选项(Preferences)就派上用场了。它提供了一种Key-Value键值型的数据存储方式,让我们能够轻松地保存和查询这些轻量级的数据。🔍

用户首选项就像是应用的小小记忆库,它将数据缓存在内存中,让我们能够快速读取数据。但记住,它不适合存放大量数据,因为它会占用更多的内存空间。🧠

🛠️ 用户首选项的运作机制

用户首选项的运作机制其实很简单。当我们通过ArkTS接口调用用户首选项时,系统会将数据加载到一个Preferences实例中。每个文件都对应一个唯一的Preferences实例,系统会将这个实例存储在内存中,直到我们主动移除它或者删除对应的文件。🗂️

📝 代码实战:用户首选项的ArkTS语言之旅

现在,让我们穿上编程的舞鞋,用ArkTS语言跳一支优雅的舞蹈。👯‍♀️

🌟 导入必要的模块

首先,我们需要导入@kit.ArkData模块,这是我们进行用户首选项操作的基础。

// 导入preferences模块
import { preferences } from '@kit.ArkData';

📝 获取Preferences实例

接下来,我们需要获取一个Preferences实例。这就像是打开我们的数据记忆库。

// 获取Preferences实例
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);
  }
}

📝 写入数据

现在,我们可以使用putSync()方法将数据保存到缓存的Preferences实例中。如果需要,我们还可以调用flush()方法将数据存储到持久化文件中。

// 检查键是否存在,如果不存在则写入数据
if (dataPreferences.hasSync('startup')) {  
  console.info("键 'startup' 已存在。");
} else {  
  console.info("键 'startup' 不存在。");
  dataPreferences.putSync('startup', 'auto');  
  let uInt8Array1 = new util.TextEncoder().encodeInto("~!@#¥%……&*()——+?");  
  dataPreferences.putSync('uInt8', uInt8Array1);
}

📝 读取数据

使用getSync()方法获取数据,如果值为null或者非默认值类型,则返回默认数据。

// 获取数据
let val = dataPreferences.getSync('startup', 'default');
console.info("键 'startup' 的值是 " + val);
let uInt8Array2: preferences.ValueType = dataPreferences.getSync('uInt8', new Uint8Array(0));
let textDecoder = util.TextDecoder.create('utf-8');
val = textDecoder.decodeToString(uInt8Array2 as Uint8Array);
console.info("键 'uInt8' 的值是 " + val);

📝 删除数据

使用deleteSync()方法删除指定键值对。

// 删除数据
dataPreferences.deleteSync('startup');

📝 数据持久化

应用存入数据到Preferences实例后,可以使用flush()方法实现数据持久化。

// 数据持久化
dataPreferences.flush((err: BusinessError) => {  
  if (err) {    
    console.error(`数据持久化失败。代码:${err.code}, 信息:${err.message}`);    
    return;  
  }  
  console.info('数据持久化成功。');
})

📝 订阅数据变更

应用订阅数据变更需要指定observer作为回调方法。订阅的Key值发生变更后,当执行flush()方法时,observer被触发回调。

// 订阅数据变更
let observer = (key: string) => {  
  console.info('键 ' + key + ' 发生了变化。');  
}
dataPreferences.on('change', observer);
dataPreferences.put('startup', 'manual', (err: BusinessError) => {  
  if (err) {    
    console.error(`设置键 'startup' 的值失败。代码:${err.code}, 信息:${err.message}`);    
    return;  
  }  
  console.info("设置键 'startup' 的值成功。");  
  if (dataPreferences !== null) {  
    dataPreferences.flush((err: BusinessError) => {      
      if (err) {        
        console.error(`数据持久化失败。代码:${err.code}, 信息:${err.message}`);        
        return;      
      }  
      console.info('数据持久化成功。');  
    })  
  }  
})

📝 删除指定文件

使用deletePreferences()方法从内存中移除指定文件对应的Preferences实例,包括内存中的数据。若该Preference存在对应的持久化文件,则同时删除该持久化文件。

// 删除指定文件
preferences.deletePreferences(this.context, options, (err: BusinessError) => {  
  if (err) {    
    console.error(`删除Preferences失败。代码:${err.code}, 信息:${err.message}`);     
    return;  
  }  
  console.info('删除Preferences成功。');
})

🌟 用户首选项的应用场景

用户首选项适用于保存用户的个性化设置,如字体大小、夜间模式等。这些数据通常不会占用太多的内存,而且读取速度很快。🌙

🚧 约束限制

在使用用户首选项时,我们需要注意以下几点:

  • 首选项无法保证进程并发安全,会有文件损坏和数据丢失的风险,不支持在多进程场景下使用。
  • Key键为string类型,要求非空且长度不超过1024个字节。
  • 如果Value值为string类型,请使用UTF-8编码格式,可以为空,不为空时长度不超过16 * 1024 * 1024个字节。
  • 内存会随着存储数据量的增大而增大,所以存储的数据量应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销。

通过用户首选项,我们可以轻松地保存和查询轻量级的用户个性化设置。这不仅提高了应用的用户体验,还让我们的数据管理变得更加简单和高效。🌟

希望这次旅行能让你对用户首选项有了更深的理解。如果你有任何问题,或者想要了解更多,欢迎继续探索和提问。🔍

让我们一起期待,在HarmonyOS的魔法下,我们的数字生活将变得更加精彩!🌟

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2024-11-7 22:44:32修改
1
收藏 1
回复
举报
2条回复
按时间正序
/
按时间倒序
superdelphi
superdelphi

感谢分享

回复
2024-11-8 12:02:25
物联风景
物联风景

挺不错,都讲到了


回复
2024-11-11 10:19:36
回复
    相关推荐