探秘鴻蒙 HarmonyOS NEXT:鴻蒙存儲核心技術全解析

引言

本文章基于HarmonyOS?NEXT操作系統,API12以上的版本。

ArkTS (ArkUI 框架) 中,用戶首選項 (Preferences)持久化存儲 (PersistentStorage) 都用于數據存儲,但它們有不同的應用場景和特點。


1. 用戶首選項 (Preferences)

概念

  • 輕量級鍵值對存儲,主要用于存儲用戶設置或小型數據,如應用配置、主題模式、語言等。
  • 適用于 頻繁讀取少量更新 的數據存儲。

特點

  • 主要用于存儲簡單的鍵值對,如 booleanstringnumber 等。
  • 數據存儲在 本地沙盒 中,并會在 應用重新啟動后保持不變
  • 適合存儲 小量數據,如 UI 設置、開關狀態等。

使用場景

  • 主題模式(淺色/深色模式)。
  • 語言偏好設置(中文/英文)。
  • 記住用戶是否已登錄(布爾值)。
  • 開關設置,如通知開關。

示例代碼

import preferences from '@ohos.data.preferences';// 獲取 Preferences 實例
async function saveThemePreference(isDarkMode: boolean) {const preferencesInstance = await preferences.getPreferences(globalThis, 'user_settings');await preferencesInstance.put('dark_mode', isDarkMode);await preferencesInstance.flush(); // 確保數據寫入
}// 讀取 Preferences
async function getThemePreference(): Promise<boolean> {const preferencesInstance = await preferences.getPreferences(globalThis, 'user_settings');return await preferencesInstance.get('dark_mode', false); // 默認值 false
}

2. 核心API介紹

Preferences 組件主要提供 讀取、寫入、刪除 用戶首選項的方法。常用的 API 主要包括:

(1)獲取 Preferences 實例

在 OpenHarmony 設備上,用戶首選項存儲在 文件 中,因此需要指定存儲路徑。

import preferences from '@ohos.data.preferences';async function getPreferences() {try {const pref = await preferences.getPreferences(globalThis.getContext(), 'settings.preferences');return pref;} catch (err) {console.error('獲取 Preferences 失敗:', err);}
}
  • getPreferences(context, fileName): 通過 文件名 獲取 Preferences 實例,該文件存儲在應用的數據目錄下。
  • context: 需要傳入全局應用上下文 globalThis.getContext()

(2)存儲數據

使用 put() 方法存儲鍵值對數據,并使用 flush() 進行同步保存。

async function savePreferences() {const pref = await getPreferences();if (!pref) return;pref.put('theme', 'dark');  // 存儲字符串pref.put('volume', 50);      // 存儲數值pref.put('notifications', true);  // 存儲布爾值await pref.flush();  // 立即保存到本地console.log('數據已保存');
}
  • put(key, value): 存儲 key-value 鍵值對。
  • flush(): 同步 寫入存儲,否則數據可能不會立即寫入。

(3)讀取數據

使用 get() 方法獲取存儲的數據:

async function loadPreferences() {const pref = await getPreferences();if (!pref) return;const theme = pref.get('theme', 'light');  // 默認值 "light"const volume = pref.get('volume', 10);     // 默認值 10const notifications = pref.get('notifications', false);  // 默認值 falseconsole.log(`當前主題: ${theme}, 音量: ${volume}, 通知開關: ${notifications}`);
}
  • get(key, defaultValue): 讀取 存儲的值,如果鍵不存在,則返回默認值。

(4)刪除數據

使用 delete() 方法移除指定鍵:

async function removePreferenceKey() {const pref = await getPreferences();if (!pref) return;pref.delete('theme');  // 刪除 "theme" 配置項await pref.flush();  // 確保數據同步更新console.log('主題設置已刪除');
}
  • delete(key): 刪除指定 key 對應的值。

(5)清除所有數據

可以使用 clear() 方法清空整個 Preferences。

async function clearPreferences() {const pref = await getPreferences();if (!pref) return;pref.clear();  // 清空所有數據await pref.flush();console.log('所有用戶設置已清除');
}
  • clear(): 清空所有存儲的鍵值對數據。

3. 持久化存儲 (PersistentStorage)

概念

  • 更通用的數據存儲方式,可以用于存儲更大規模的結構化數據,如對象、列表或復雜數據。
  • 通常與本地數據庫(如 SQLite文件存儲)結合使用。

特點

  • 適用于 存儲較大數據量,如緩存數據、用戶數據、應用狀態等。
  • 提供更豐富的 API,支持復雜的數據管理。
  • 數據存儲在應用的私有目錄,可以長期存儲,即使應用重啟也不會丟失。

使用場景

  • 用戶賬戶信息(如用戶名、頭像)。
  • 應用的緩存數據(如搜索歷史、下載列表)。
  • 復雜的設置數據(如 JSON 結構的配置)。
  • 離線數據存儲(如離線文檔、任務列表)。

示例代碼(基于數據存儲組件)

import { PersistentStorage } from '@ohos.data.storage';// 保存數據
async function saveUserData(userData: any) {const storage = new PersistentStorage('user_data'); // 創建存儲實例await storage.set('profile', JSON.stringify(userData));await storage.flush(); // 確保數據寫入
}// 讀取數據
async function getUserData(): Promise<any> {const storage = new PersistentStorage('user_data');const userDataStr = await storage.get('profile', '{}'); // 默認值為空對象return JSON.parse(userDataStr);
}

4. 核心API介紹

(1)存儲數據

使用 set() 方法存儲數據:

storage.set('username', 'Alice');
storage.set('age', 25);
storage.set('isPremiumUser', true);
  • 該方法支持存儲 字符串、數值、布爾值等基本數據類型
  • 數據存儲在應用本地,不會在應用重啟時丟失。

(2)獲取數據

使用 get<T>() 方法獲取存儲的數據:

let username: string = storage.get<string>('username', 'defaultUser');
let age: number = storage.get<number>('age', 0);
let isPremium: boolean = storage.get<boolean>('isPremiumUser', false);
  • 參數
    • 第一個參數是鍵(key)。
    • 第二個參數是 默認值(當 key 不存在時返回此值)。
  • 返回值類型 需要顯式指定(泛型 <T>)。

(3)刪除數據

使用 delete() 方法刪除某個鍵值:

storage.delete('username');
  • 刪除后,使用 get() 方法查詢時將返回默認值。

(4)清空所有數據

使用 clear() 方法刪除所有存儲的鍵值對:

storage.clear();
  • 該方法會清除 PersistentStorage 中存儲的所有數據,謹慎使用!

(5)數據是否存在

使用 has() 方法檢查某個鍵是否存在:

if (storage.has('username')) {console.log('用戶名已存儲');
} else {console.log('用戶名不存在');
}

(6)簡單封裝

以下是一個簡單封裝的 PersistentStorage 工具類:

import { PersistentStorage } from '@ohos.data.preferences';class StorageUtil {private static instance: PersistentStorage;private constructor() {}/*** 獲取 PersistentStorage 實例(單例模式)*/private static getInstance(): PersistentStorage {if (!this.instance) {this.instance = PersistentStorage.getSharedInstance();}return this.instance;}/*** 存儲數據* @param key 鍵名* @param value 要存儲的值(支持 string、number、boolean)*/static set<T>(key: string, value: T): void {this.getInstance().set(key, value);}/*** 獲取存儲數據* @param key 鍵名* @param defaultValue 默認值(如果 key 不存在,則返回此值)* @returns 存儲的數據*/static get<T>(key: string, defaultValue: T): T {return this.getInstance().get<T>(key, defaultValue);}/*** 刪除指定 key 的存儲數據* @param key 鍵名*/static delete(key: string): void {this.getInstance().delete(key);}/*** 清除所有存儲數據*/static clear(): void {this.getInstance().clear();}/*** 判斷某個 key 是否存在* @param key 鍵名* @returns 存在返回 true,否則返回 false*/static has(key: string): boolean {return this.getInstance().has(key);}
}export default StorageUtil;// 示例使用
StorageUtil.set('username', 'Alice');
const username = StorageUtil.get('username', 'defaultUser');
console.log(`Username: ${username}`);
StorageUtil.delete('username');
console.log(StorageUtil.has('username')); // false
StorageUtil.clear();

5. 對比總結

特性用戶首選項 (Preferences)持久化存儲 (PersistentStorage)
存儲方式輕量級鍵值對存儲適用于存儲復雜數據
數據類型string, boolean, number復雜數據結構(JSON、列表等)
數據量小量數據大量數據
適用場景主題、語言、用戶偏好用戶信息、緩存、離線數據
讀寫性能讀取速度快適用于批量存儲
數據持久性持久化存儲持久化存儲

6. 使用建議

  • 如果只是存儲 簡單的設置數據,比如開關狀態、主題模式,建議使用 Preferences
  • 如果需要存儲 復雜對象(如 JSON 數據)或者 大量數據(如歷史記錄、緩存),建議使用 PersistentStorage

當然如果你的數據規模較大,還可以考慮 數據庫 (鍵值型數據庫KVManager或者關系型數據庫RdbStore) 進行存儲,以提高查詢和管理效率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898851.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898851.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898851.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Leetcode—15. 三數之和(哈希表—基礎算法)

題目&#xff1a; 給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c;同時還滿足 nums[i] nums[j] nums[k] 0 。請你返回所有和為 0 且不重復的三元組。 注意&#xff1a;答案中不可以包含重復的…

Linux 啟動Jar腳本設置開機自啟【超級詳細】

Linux 啟動Jar腳本&&設置開機自啟【超級詳細】 概要服務器開機自啟服務重啟腳本 概要 最近在Linux服務器中部署了一個項目&#xff08;單機版&#xff09;&#xff0c;每次更新服務的時候需要用到好幾個命令&#xff0c;停止服務&#xff0c;再重啟&#xff0c;并且服…

【第21節】windows sdk編程:網絡編程基礎

目錄 引言&#xff1a;網絡編程基礎 一、socket介紹(套接字) 1.1 Berkeley Socket套接字 1.2 WinSocket套接字 1.3 WSAtartup函數 1.4 socket函數 1.5 字節序轉換 1.6 綁定套接字 1.7 監聽 1.8 連接 1.9 接收數據 1.10 發送數據 1.11 關閉套接字 二、UDP連接流程…

QT 圖表(拆線圖,欄狀圖,餅狀圖 ,動態圖表)

效果 折線圖 // 創建折線數據系列// 創建折線系列QLineSeries *series new QLineSeries;// series->append(0, 6);// series->append(2, 4);// series->append(3, 8);// 創建圖表并添加系列QChart *chart new QChart;chart->addSeries(series);chart->setTit…

vector和list的區別是什么

vector 和 list 都是C 標準模板庫&#xff08;STL&#xff09;中的容器&#xff0c;它們的區別如下&#xff1a; 內存結構 - vector &#xff1a;是連續的內存空間&#xff0c;就像數組一樣&#xff0c;元素在內存中依次排列。 - list &#xff1a;是由節點組成的雙向鏈表…

【AI】【AIGC】降低AIGC檢測率:技術、挑戰與應對策略

引言 隨著生成式人工智能&#xff08;AIGC&#xff09;技術的迅速發展&#xff0c;越來越多的內容開始由人工智能生成。AIGC技術的應用非常廣泛&#xff0c;包括文本生成、圖像生成、音頻生成等。然而&#xff0c;隨著這些技術的普及&#xff0c;如何有效識別并檢測AIGC生成的…

vue3 ts 請求封裝后端接口

一 首頁-廣告區域-小程序 首頁-廣告區域-小程序 GET/home/banner1.1 請求封裝 首頁-廣告區域 home.ts export const getHomeBannerApi (distributionSite 1) > {return http<BannerItem[]>({method: GET,url: /home/banner,data: {distributionSite,},}) }函數定…

響應式CMS架構優化SEO與用戶體驗

內容概要 在數字化內容生態中&#xff0c;響應式CMS架構已成為平衡搜索引擎可見性與終端用戶體驗的核心載體。該系統通過多終端適配技術&#xff0c;確保PC、移動端及平板等設備的內容渲染一致性&#xff0c;直接降低頁面跳出率并延長用戶停留時長。與此同時&#xff0c;智能S…

算法基礎篇(1)(藍橋杯常考點)

算法基礎篇 前言 算法內容還有搜索&#xff0c;數據結構&#xff08;進階&#xff09;&#xff0c;動態規劃和圖論 數學那個的話大家也知道比較難&#xff0c;放在最后講 這期包含的內容可以看目錄 模擬那個算法的話就是題說什么寫什么&#xff0c;就不再分入目錄中了 注意事…

MyBatis一級緩存和二級緩存

介紹 在開發基于 MyBatis 的應用時&#xff0c;緩存是提升性能的關鍵因素之一。MyBatis 提供了一級緩存和二級緩存&#xff0c;合理使用它們可以顯著減少數據庫的訪問次數&#xff0c;提高系統的響應速度和吞吐量。本文將深入探討 MyBatis 一級緩存和二級緩存的工作原理、使用…

C++核心語法快速整理

前言 歡迎來到我的博客 個人主頁:北嶺敲鍵盤的荒漠貓-CSDN博客 本文主要為學過多門語言玩家快速入門C 沒有基礎的就放棄吧。 全部都是精華&#xff0c;看完能直接上手改別人的項目。 輸出內容 std::代表了這里的cout使用的標準庫&#xff0c;避免不同庫中的相同命名導致混亂 …

如何讓自動駕駛汽車“看清”世界?坐標映射與數據融合概述

在自動駕駛領域,多傳感器融合技術是實現車輛環境感知和決策控制的關鍵。其中,坐標系映射和對應是多傳感器融合的重要環節,它涉及到不同傳感器數據在統一坐標系下的轉換和匹配,以實現對車輛周圍環境的準確感知。本文將介紹多傳感器融合中坐標系映射和對應的數學基礎和實際應…

Unity Shader 的編程流程和結構

Unity Shader 的編程流程和結構 Unity Shader 的編程主要由以下三個核心部分組成&#xff1a;Properties&#xff08;屬性&#xff09;、SubShader&#xff08;子著色器&#xff09; 和 Fallback&#xff08;回退&#xff09;。下面是它們的具體作用和結構&#xff1a; 1. Pr…

第十四天- 排序

一、排序的基本概念 排序是計算機科學中一項重要的操作&#xff0c;它將一組數據元素按照特定的順序&#xff08;如升序或降序&#xff09;重新排列。排序算法的性能通常通過時間復雜度和空間復雜度來衡量。在 Python 中&#xff0c;有內置的排序函數&#xff0c;同時也可以手…

移除idea External Liraries 中maven依賴包

問題背景 擴展包里面不停的出現已經在POM文件注釋的包&#xff0c;其實是沒有查詢到根源位置。 在IDEA插件中搜索Maven Helper 點擊pom.xml文件 會出現擴展插件 定位之后在pom中添加exclusions&#xff0c;如下代碼 <dependency><groupId>com.disney.eva.framewo…

AI革命!藍耘攜手海螺AI視頻,打造智能化視頻新紀元

AI革命&#xff01;藍耘攜手海螺AI視頻&#xff0c;打造智能化視頻新紀元 前言 在這個信息爆炸的時代&#xff0c;視頻已經成為我們獲取信息、學習新知識的重要方式。而隨著人工智能&#xff08;AI&#xff09;技術的快速發展&#xff0c;AI與視頻內容的結合為我們帶來了全新的…

dify1.1.1安裝

1、 按照GitHub上操作 下載源碼&#xff0c;沒有安裝git的&#xff0c;可以下載成zip包&#xff0c; unzip 解壓 git clone https://github.com/langgenius/dify.git cd dify cd docker cp .env.example .env2、啟動前 &#xff0c;先改下 docker-compose.yaml&#xff0c;…

ElasticSearch 可觀測性最佳實踐

ElasticSearch 概述 ElasticSearch 是一個開源的高擴展的分布式全文檢索引擎&#xff0c;它可以近乎實時的存儲、檢索數據&#xff1b;本身擴展性很好&#xff0c;可以擴展到上百臺服務器&#xff0c;處理 PB 級別&#xff08;大數據時代&#xff09;的數據。ES 也使用 Java 開…

Excel處理控件Spire.XLS系列教程:C# 在 Excel 中添加或刪除單元格邊框

單元格邊框是指在單元格或單元格區域周圍添加的線條。它們可用于不同的目的&#xff0c;如分隔工作表中的部分、吸引讀者注意重要的單元格或使工作表看起來更美觀。本文將介紹如何使用 Spire.XLS for .NET 在 C# 中添加或刪除 Excel 單元格邊框。 安裝 Spire.XLS for .NET E-…

前端Wind CSS面試題及參考答案

目錄 標準盒模型與 IE 盒模型的區別是什么?如何通過 box-sizing 屬性切換這兩種盒模型? 如何計算一個元素在標準盒模型下的總寬度(包含 margin、padding、border)? 父元素高度塌陷的原因是什么?請列舉至少 3 種清除浮動的方法。 方法一:使用 clear 屬性 方法二:使用…