1 概述
在移動互聯網蓬勃發展的今天,移動應用給我們生活帶來了極大的便利,這些便利的本質在于數據的互聯互通。因此在應用的開發中數據存儲占據了非常重要的位置,HarmonyOS應用開發也不例外。
2 什么是首選項
首選項為應用提供Key-Value鍵值型的數據存儲能力,支持應用持久化輕量級數據,并對其進行增刪除改查等。該存儲對象中的數據會被緩存在內存中,因此它可以獲得更快的存取速度,下面詳細介紹下首選項的開發過程。
3 首選項運作機制
首選項的特點是:
1、以Key-Value形式存儲數據
Key是不重復的關鍵字,Value是數據值。
2、非關系型數據庫
區別于關系型數據庫,它不保證遵循ACID(Atomicity, Consistency, Isolation and Durability)特性,數據之間無關系。
進程中每個文件僅存在一個Preferences實例,應用獲取到實例后,可以從中讀取數據,或者將數據存入實例中。通過調用flush方法可以將實例中的數據回寫到文件里。
與關系數據庫的區別:
4 常用接口介紹
常用接口有:保存數據(put)、獲取數據(get)、是否包含指定的key(has)、刪除數據(delete)、數據持久化(flush)等,后面依次詳細介紹接口使用。
常用接口使用前提
1、需要導入@ohos.data.preferences模塊到PreferencesUtil開發環境中,實例名字命名為dataPreferences,同時定義兩個常量PREFERENCES_NAME和KEY_APP_FONT_SIZE。(注:把常用接口封裝在PreferencesUtil工具類里面,為了方便后面代碼直接調用)相關代碼實現如下:
// PreferencesUtil.ets
import dataPreferences from '@ohos.data.preferences';...const PREFERENCES_NAME = 'myPreferences'; // 首選項名字const KEY_APP_FONT_SIZE = 'appFontSize'; // 首選項Key字段
2、需要在entryAbility的onCreate方法獲取首選項實例,以便后續能進行保存、讀取、刪除等操作,獲取實例需要上下文context和文件名字PREFERENCES_NAME,相關代碼實現如下:
// entryAbility.ets onCreate(want, launchParam) {Logger.info(TAG, 'onCreate');globalThis.abilityWant = want;// 創建首選項PreferencesUtil.createFontPreferences(this.context);...}
// PreferencesUtil.ets createFontPreferences(context) {globalThis.getFontPreferences = (() => {// 獲取首選項實例let preferences: Promise<dataPreferences.Preferences> = dataPreferences.getPreferences(context, PREFERENCES_NAME);return preferences;});}
保存數據(put)
1、在entryAbility的onCreate方法,調用PreferencesUtil.saveDefaultFontSize保存默認數據,先用has方法判斷當前key是否有存在,如果沒有就通過put方法把用戶數據保存起來,該方法通過key-value鍵值對方式保存,常量KEY_APP_FONT_SIZE作為key,用戶數據fontSize作為value,再通過flush方法把數據保存到文件,相關代碼實現如下:
// entryAbility.ets onCreate(want, launchParam) {Logger.info(TAG, 'onCreate');globalThis.abilityWant = want;...// 設置字體默認大小PreferencesUtil.saveDefaultFontSize(Constants.SET_SIZE_STANDARD);}
// PreferencesUtil.ets saveDefaultFontSize(fontSize: number) {globalThis.getFontPreferences().then((preferences) => {// 判斷保存的key是否存在preferences.has(KEY_APP_FONT_SIZE).then(async (isExist) => {Logger.info(TAG, 'preferences has changeFontSize is ' + isExist);if (!isExist) {// 保存數據await preferences.put(KEY_APP_FONT_SIZE, fontSize);preferences.flush();}}).catch((err) => {Logger.error(TAG, 'Has the value failed with err: ' + err);});}).catch((err) => {Logger.error(TAG, 'Get the preferences failed, err: ' + err);});}
2、在SetFontSizePage頁面,當手指移動Slider滑動條時,在onChange方法回調當前進度值,把當前進度值通過PreferencesUtil.saveChangeFontSize方法保存起來,再通過flush方法把數據保存到文件,相關代碼實現如下:
// SetFontSizePage.etsbuild() {Row() {Slider({...}).onChange((value: number) => {// 保存當前進度值PreferencesUtil.saveChangeFontSize(this.changeFontSize);})}}
// PreferencesUtil.ets saveChangeFontSize(fontSize: number) {globalThis.getFontPreferences().then(async (preferences) => {// 保存數據await preferences.put(KEY_APP_FONT_SIZE, fontSize);preferences.flush();}).catch((err) => {Logger.error(TAG, 'put the preferences failed, err: ' + err);});}
獲取數據(get)
在HomePage的onPageShow方法,調用PreferencesUtil.getChangeFontSize方法獲取用戶數據,調用get方法獲取,該方法通過key-value鍵值對方式讀取,常量KEY_APP_FONT_SIZE作為key,默認數據fontSize作為value,把的到的結果賦值給變量fontSize,通過return方式把值返回去,相關代碼實現如下:
// HomePage.etsonPageShow() {PreferencesUtil.getChangeFontSize().then((value) => {this.changeFontSize = value;Logger.info(TAG, 'Get the value of changeFontSize: ' + this.changeFontSize);});}
// PreferencesUtil.ets async getChangeFontSize() {let fontSize: number = 0;const preferences = await globalThis.getFontPreferences();fontSize = await preferences.get(KEY_APP_FONT_SIZE, fontSize);return fontSize;}
是否包含指定的key(has)
通過has方法判斷首選項中是否包含指定的key,保證指定的key不會被重復保存,相關代碼實現如下:
// PreferencesUtil.ets saveDefaultFontSize(fontSize: number) {globalThis.getFontPreferences().then((preferences) => {// 判斷保存的key是否存在preferences.has(KEY_APP_FONT_SIZE).then(async (isExist) => {Logger.info(TAG, 'preferences has changeFontSize is ' + isExist);}).catch((err) => {Logger.error(TAG, 'Has the value failed with err: ' + err);});}).catch((err) => {Logger.error(TAG, 'Get the preferences failed, err: ' + err);});}
數據持久化(flush)
通過flush方法把應用數據保存到文件中,使得應用數據保存期限變長,相關代碼實現如下:
// PreferencesUtil.ets saveChangeFontSize(fontSize: number) {globalThis.getFontPreferences().then(async (preferences) => {// 保存數據await preferences.put(KEY_APP_FONT_SIZE, fontSize);// 數據持久化preferences.flush();}).catch((err) => {Logger.error(TAG, 'put the preferences failed, err: ' + err);});}
刪除數據(delete)
刪除首選項數據需要獲取preferences實例,用delete方法刪除指定的key所對應的值,常量KEY_APP_FONT_SIZE作為key,通過Promise異步回調是否刪除成功,相關代碼實現如下:
// PreferencesUtil.ets async deleteChangeFontSize() {const preferences: dataPreferences.Preferences = await globalThis.getFontPreferences();// 刪除數據let deleteValue = preferences.delete(KEY_APP_FONT_SIZE);deleteValue.then(() => {Logger.info(TAG, 'Succeeded in deleting the key appFontSize.');}).catch((err) => {Logger.error(TAG, 'Failed to delete the key appFontSize. Cause: ' + err);});}