數據持久化簡述
數據持久化就是將內存數據通過文件或者數據庫的方式保存到設備中。HarmonyOS提供兩兩種持久化方案:
- Preferences:主要用于保存一些配置信息,是通過文本的形式存儲的,在使用中會將文本中的數據全量加載到內存中,不太適合存儲大量數據的場景。
- 數據庫:分為兩種,一種是非關系型數據庫,數據是鍵值對的形式存儲;另外一種事關系型數據庫,數據是行和列的形式存儲,提供一個系列的增刪改查等SQL操作,適合數據復雜的場景,比如聊天會話記錄等等。
基本使用與封裝
Preferences
提供了獲取實例、讀、取、刪對應操作的方法:
-
getPreferences(context,name)
:獲取Preferences
實例,name
是存儲的文件名; -
get(k)
:通過key獲取value值; -
getAll()
:獲取文件所有的值; -
put(k,v)
:添加值,同一個key會將之前的值覆蓋掉,需要通過flush()
刷新到文件中; -
delete(k)
:通過key刪除對應的value值; -
clear()
:刪除所有的存儲值。
注意:以上方法都是異步的。
通常會在EntryAbility#onCreate()
方法中創(chuàng)建實例,其中context
便是EntryAbility
的上下文,獲取preferences
實例就可以對數據增刪改查操作。
// 導入包
import dataPreferences from '@ohos.data.preferences'
// 獲取實例
let preferences = dataPreferences.getPreferences(context, this.preferencesName)
下面對preferences
進行封裝,基本思路:
在獲取preferences
實例后會將其保存單例中,這個單例是GlobalContext
,方便后期可以通過單例直接獲取實例;由于get()
返回值類型是不確定性,定義一個聯(lián)合類型的別名ValueType
來接收。
const TAG = "PreferencesUtils"
// 默認文件名,可以在構造函數進行修改
const PREFERENCES_NAME = 'yiPreferences'
const KEY_PREFERENCES = "preferences"
type ValueType = number | string | boolean | Array<number> | Array<string> | Array<boolean>;
export class PreferencesUtils{
// preferences的文件名
private preferencesName: string = PREFERENCES_NAME
// 用于獲取preferences實例的key值,保存到單例中
private keyPreferences: string = KEY_PREFERENCES
constructor(name: string = PREFERENCES_NAME, keyP: string = KEY_PREFERENCES) {
this.preferencesName = name
this.keyPreferences = keyP
}
createPreferences(context: Context): Promise<dataPreferences.Preferences> {
let preferences = dataPreferences.getPreferences(context, this.preferencesName)
GlobalContext.getContext().setObject(this.keyPreferences, preferences)
return preferences
}
getPreferences(): Promise<dataPreferences.Preferences> {
return GlobalContext.getContext().getObject(KEY_PREFERENCES) as Promise<dataPreferences.Preferences>
}
async get(key: string, def?: ValueType): Promise<ValueType> {
return (await this.getPreferences()).get(key, def)
}
async getAll(): Promise<Object> {
let preferences = await this.getPreferences()
return preferences.getAll()
}
async put(key: string, value: ValueType): Promise<void> {
let promise = await this.getPreferences().then(async (p) => {
await p.put(key, value)
await p.flush();
}).catch((err)=>{
Logger.d(TAG, err)
})
return promise
}
async delete(key: string): Promise<void> {
return (await this.getPreferences()).delete(key).finally(async () => {
(await this.getPreferences()).flush()
})
}
async clear(): Promise<void> {
return (await this.getPreferences()).clear().finally(async () => {
(await this.getPreferences()).flush()
})
}
}
export default new PreferencesUtils()
在EntryAbility#onCreate()
方法初始化:
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
PreferencesUtils.createPreferences(this.context)
}
}
GlobalContext
文章來源:http://www.zghlxwxcb.cn/news/detail-752344.html
export default class GlobalContext {
private constructor() { }
private static instance: GlobalContext;
private _objects = new Map<string, Object>();
public static getContext(): GlobalContext {
if (!GlobalContext.instance) {
GlobalContext.instance = new GlobalContext();
}
return GlobalContext.instance;
}
getObject(value: string): Object | undefined {
return this._objects.get(value);
}
setObject(key: string, objectClass: Object): void {
this._objects.set(key, objectClass);
}
}
測試用例
通過異步async
和await
來直接獲取操作結果,也可以在then
方法回調中獲取結果。文章來源地址http://www.zghlxwxcb.cn/news/detail-752344.html
@Component
@Entry
struct PreferencesPage {
@State text: string = ""
aboutToAppear() {
PreferencesUtils.put("username", "Harden")
PreferencesUtils.put("age", 28)
PreferencesUtils.put("isStaff", true)
}
build() {
Column() {
Text(this.text)
.width('100%')
.height(60)
Row() {
Button("get")
.onClick(async () => {
this.text = await PreferencesUtils.get('username') as string
})
Button("getAll")
.onClick(async () => {
this.getAll()
})
Button("put")
.onClick(async () => {
await PreferencesUtils.put("username", "Kobe")
await PreferencesUtils.put("age", 28)
await PreferencesUtils.put("isStaff", false)
this.getAll()
})
Button("delete")
.onClick(async () => {
await PreferencesUtils.delete("isStaff")
this.getAll()
})
Button("clear")
.onClick(async () => {
await PreferencesUtils.clear()
this.getAll()
})
}
.width('100%')
.justifyContent(FlexAlign.Center)
}
}
async getAll() {
let v = await PreferencesUtils.getAll() as Object
this.text = JSON.stringify(v)
}
}
參考
- https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667367018821971?ha_linker=eyJ0cyI6MTcwMjM5NzEzNzM3MywiaWQiOiI4MmM3ZTI1MmFmMDJlMDZiODBmOGU1ZDM5ZTI5YmMyOCJ9
到了這里,關于HarmonyOS鴻蒙應用開發(fā)——數據持久化Preferences的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!