北京公司網(wǎng)站制作電話網(wǎng)絡(luò)營(yíng)銷推廣外包服務(wù)
鴻蒙通過(guò)用戶首選項(xiàng)實(shí)現(xiàn)數(shù)據(jù)持久化
1.1 場(chǎng)景介紹
用戶首選項(xiàng)為應(yīng)用提供Key-Value鍵值型的數(shù)據(jù)處理能力,支持應(yīng)用持久化輕量級(jí)數(shù)據(jù),并對(duì)其修改和查詢。當(dāng)用戶希望有一個(gè)全局唯一存儲(chǔ)的地方,可以采用用戶首選項(xiàng)來(lái)進(jìn)行存儲(chǔ)。Preferences會(huì)將該數(shù)據(jù)緩存在內(nèi)存中,當(dāng)用戶讀取的時(shí)候,能夠快速?gòu)膬?nèi)存中獲取數(shù)據(jù),當(dāng)需要持久化時(shí)可以使用flush接口將內(nèi)存中的數(shù)據(jù)寫(xiě)入持久化文件中。Preferences會(huì)隨著存放的數(shù)據(jù)量越多而導(dǎo)致應(yīng)用占用的內(nèi)存越大,因此,Preferences不適合存放過(guò)多的數(shù)據(jù),也不支持通過(guò)配置加密,適用的場(chǎng)景一般為應(yīng)用保存用戶的個(gè)性化設(shè)置(字體大小,是否開(kāi)啟夜間模式)等。
2.1 運(yùn)作機(jī)制
用戶首選項(xiàng)為應(yīng)用提供Key-Value鍵值型的數(shù)據(jù)處理能力,支持應(yīng)用持久化輕量級(jí)數(shù)據(jù),并對(duì)其修改和查詢。當(dāng)用戶希望有一個(gè)全局唯一存儲(chǔ)的地方,可以采用用戶首選項(xiàng)來(lái)進(jìn)行存儲(chǔ)。Preferences會(huì)將該數(shù)據(jù)緩存在內(nèi)存中,當(dāng)用戶讀取的時(shí)候,能夠快速?gòu)膬?nèi)存中獲取數(shù)據(jù),當(dāng)需要持久化時(shí)可以使用flush接口將內(nèi)存中的數(shù)據(jù)寫(xiě)入持久化文件中。Preferences會(huì)隨著存放的數(shù)據(jù)量越多而導(dǎo)致應(yīng)用占用的內(nèi)存越大,因此,Preferences不適合存放過(guò)多的數(shù)據(jù),也不支持通過(guò)配置加密,適用的場(chǎng)景一般為應(yīng)用保存用戶的個(gè)性化設(shè)置(字體大小,是否開(kāi)啟夜間模式)等。
- 每個(gè)key的value的長(zhǎng)度最大為8kb
- 創(chuàng)建首選項(xiàng)-倉(cāng)庫(kù)的概念-應(yīng)用可以有N個(gè)倉(cāng)庫(kù),一個(gè)倉(cāng)庫(kù)中可以有N個(gè)key
3.1 接口說(shuō)明
接口名稱及方法簽名 | 描述 | 參數(shù) | 同步/異步類型 | 約束條件 |
---|---|---|---|---|
getPreferencesSync(context: Context, options: Options): Preferences | 獲取 Preferences 實(shí)例 | context : 上下文對(duì)象options : 配置選項(xiàng) | 同步 | 存在對(duì)應(yīng)的異步接口 |
putSync(key: string, value: ValueType): void | 寫(xiě)入鍵值對(duì)(需調(diào)用 flush 持久化存儲(chǔ)) | key : 鍵名value : 值(需滿足 ValueType 類型要求) | 同步 | 存在異步接口 |
hasSync(key: string): boolean | 檢查是否包含指定鍵的鍵值對(duì) | key : 鍵名 | 同步 | - 鍵名不能為空 - 存在異步接口 |
getSync(key: string, defValue: ValueType): ValueType | 獲取鍵對(duì)應(yīng)的值(若為空或類型不匹配則返回 defValue ) | key : 鍵名defValue : 默認(rèn)值 | 同步 | 存在異步接口 |
deleteSync(key: string): void | 刪除指定鍵的鍵值對(duì) | key : 鍵名 | 同步 | 存在異步接口 |
flush(callback: AsyncCallback<void>): void | 將數(shù)據(jù)異步持久化到文件 | callback : 異步回調(diào) | 異步 | - |
on(type: 'change', callback: Callback<string>): void | 訂閱數(shù)據(jù)變更事件(在 flush 后觸發(fā)) | type : 事件類型(僅支持 'change' )callback : 回調(diào)函數(shù)(參數(shù)為變更的 key ) | - | - |
off(type: 'change', callback?: Callback<string>): void | 取消訂閱數(shù)據(jù)變更事件 | type : 事件類型('change' )callback : 可選回調(diào)函數(shù) | - | 若未指定 callback 則取消全部訂閱 |
deletePreferences(context: Context, options: Options, callback: AsyncCallback<void>): void | 從內(nèi)存移除實(shí)例并刪除持久化文件(若有) | context : 上下文對(duì)象options : 配置選項(xiàng)callback : 異步回調(diào) | 異步 | - |
4.1 開(kāi)發(fā)步驟
1.導(dǎo)入@kit.ArkData模塊。
import { preferences } from "@kit.ArkData";
2.獲取preference實(shí)例,拿到倉(cāng)庫(kù)
getPreferenceSync
接受兩個(gè)參數(shù),其中一個(gè)參數(shù)是context,另一個(gè)參數(shù)是options
-
context
代表了用戶的上下文,是ability的能力級(jí),也是ability的一個(gè)環(huán)境,這個(gè)東西如果想要獲取分兩種情況-
在ability中區(qū)獲取 在
onWindowStageCreate
寫(xiě)入這行代碼即可MyPreferenceClass.context = this.context
-
在UI界面去拿
getContext(this)
-
-
options
是傳遞給preferences.getPreferencesSync()
的配置對(duì)象,用于定義存儲(chǔ)實(shí)例的倉(cāng)庫(kù)名稱、安全模式等關(guān)鍵屬性
const store = preferences.getPreferencesSync(MyPreferenceClass.context||getContext(),{//拿到該名稱的倉(cāng)庫(kù),拿不到就會(huì)給你創(chuàng)建該名稱的倉(cāng)庫(kù),類似數(shù)據(jù)庫(kù)name:'infoStore'})return store
3.創(chuàng)建增刪改的方法
//2.寫(xiě)入字段,持久化存儲(chǔ)static async putStore(info:string){const store = MyPreferenceClass.getStore()store.putSync('info',info)await store.flush()}//3.獲取數(shù)據(jù)static getValue(){const store = MyPreferenceClass.getStore()const value = store.getSync('info','666666')return value}//4.刪除數(shù)據(jù)static async deleteValue(){const store = MyPreferenceClass.getStore()//如果不加上flush操作,只是在內(nèi)存中刪除,需要加上flush操作才能寫(xiě)入磁盤(pán)!store.deleteSync('info')await store.flush()}//5.判斷數(shù)據(jù)是否存在static judjeValue(val:string){const store = MyPreferenceClass.getStore()const value = store.hasSync(val)return value}
4.測(cè)試代碼
import { MyPreferenceClass } from './utils/MyPreferenceClass'@Entry
@Component
struct Mytest {// @State 實(shí)時(shí)更新@State currentValue: string = '今天天氣真不錯(cuò)!'@State JudeValue: boolean = falsebuild() {//初始化默認(rèn)值Column({ space: 10 }) {Text(this.currentValue)Text(this.JudeValue + '')Button('寫(xiě)入數(shù)據(jù)').onClick(() => {MyPreferenceClass.putStore('今天天氣并不好')})Button('展示數(shù)據(jù)').onClick(() => {this.currentValue = MyPreferenceClass.getValue() as string})Button('刪除數(shù)據(jù)').onClick(() => {MyPreferenceClass.deleteValue()})Button('是否展示該數(shù)據(jù)').onClick(() => {this.JudeValue = MyPreferenceClass.judjeValue('info')})}.height('100%').width('100%')}