# 鴻蒙通過(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` | 將數(shù)據(jù)異步持久化到文件 | `callback`: 異步回調(diào) | 異步 | - |
| `on(type: 'change', callback: Callback): void` | 訂閱數(shù)據(jù)變更事件(在 `flush` 后觸發(fā)) | `type`: 事件類型(僅支持 `'change'`)
`callback`: 回調(diào)函數(shù)(參數(shù)為變更的 `key`) | - | - |
| `off(type: 'change', callback?: Callback): void` | 取消訂閱數(shù)據(jù)變更事件 | `type`: 事件類型(`'change'`)
`callback`: 可選回調(diào)函數(shù) | - | 若未指定 `callback` 則取消全部訂閱 |
| `deletePreferences(context: Context, options: Options, callback: AsyncCallback): void` | 從內(nèi)存移除實(shí)例并刪除持久化文件(若有) | `context`: 上下文對(duì)象
`options`: 配置選項(xiàng)
`callback`: 異步回調(diào) | 異步 | - |
## 4.1 開(kāi)發(fā)步驟
### 1.導(dǎo)入@kit.ArkData模塊。
```ts
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è)東西如果想要獲取分兩種情況
1. 在ability中區(qū)獲取 在`onWindowStageCreate`寫(xiě)入這行代碼即可
```ts
MyPreferenceClass.context = this.context
```
2. 在UI界面去拿
```ts
getContext(this)
```
* `options` 是傳遞給 `preferences.getPreferencesSync()` 的配置對(duì)象,用于定義存儲(chǔ)實(shí)例的倉(cāng)庫(kù)名稱、安全模式等關(guān)鍵屬性
```ts
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)建增刪改的方法
```ts
//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è)試代碼
```ts
import { MyPreferenceClass } from './utils/MyPreferenceClass'
@Entry
@Component
struct Mytest {
// @State 實(shí)時(shí)更新
@State currentValue: string = '今天天氣真不錯(cuò)!'
@State JudeValue: boolean = false
build() {
//初始化默認(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%')
}
```
審核編輯 黃宇
-
鴻蒙
+關(guān)注
關(guān)注
57文章
2469瀏覽量
43642 -
Harmony
+關(guān)注
關(guān)注
0文章
63瀏覽量
2852
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
鴻蒙OS開(kāi)發(fā)實(shí)例:【工具類封裝-首選項(xiàng)本地存儲(chǔ)】

HarmonyOS開(kāi)發(fā)案例:【用戶首選項(xiàng)】

如何設(shè)置Xilinx ISE首選項(xiàng)11.x 12.x的默認(rèn)值
查看首選項(xiàng)未保存, 如何保存設(shè)置?
Harmony os java api對(duì)應(yīng)的實(shí)現(xiàn)代碼沒(méi)有開(kāi)放嗎?
ESP8266/ARDUINO構(gòu)建H找不到首選項(xiàng)怎么解決?
HarmonyOS數(shù)據(jù)管理與應(yīng)用數(shù)據(jù)持久化(一)
關(guān)于MPLAB Harmony中項(xiàng)目恢復(fù)和備份選項(xiàng)的具體介紹
華為認(rèn)為Harmony OS成熟需要5到10年
Harmony OS網(wǎng)絡(luò)編程實(shí)驗(yàn)指南
redis持久化機(jī)制和如何實(shí)現(xiàn)持久化
鴻蒙開(kāi)發(fā)接口數(shù)據(jù)管理:【@ohos.data.preferences (首選項(xiàng))】
harmony OS NEXT-基本介紹及DevcoStudiop基本使用

評(píng)論