HarmonyOS 鸿蒙Next 如何使用首选项实现持久化
HarmonyOS 鸿蒙Next 如何使用首选项实现持久化
如何使用首选项实现持久化
2 回复
preferences.deletePreferences: 从缓存中移出指定的Preferences实例,若Preferences实例有对应的持久化文件,则同时删除其持久化文件。使用callback异步回调。参考链接: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-data-preferences-V5#preferencesdeletepreferences
参考demo:
import { promptAction } from '@kit.ArkUI';
import { preferences } from '@kit.ArkData';
let context = getContext(this);
let preference: preferences.Preferences;
let preferenceTemp: preferences.Preferences;
// 对象类
export class ImageModel {
constructor(id: string, tokenInfo: string, imgInfo: string, urlInfo: string) {
this.id = id
this.token = tokenInfo
this.img = imgInfo
this.url = urlInfo
}
id?: string = '';
token: string = '';
img: string = '';
url: string = ''
}
// 首选项工具类
class PreferenceModel {
// 初始化
async getPreferencesFromStorage() {
try {
preference = await preferences.getPreferences(context,'ImageUrlData.db');
} catch (err) {
console.error('[PreferenceModel]', `Failed to get preferences, Cause: ${err}`);
}
}
// 删除首选项
async deletePreferences() {
try {
await preferences.deletePreferences(context, 'ImageUrlData.db');
} catch(err) {
console.error('[PreferenceModel]', `Failed to delete preferences, Cause: ${err}`);
};
preference = preferenceTemp;
this.showToastMessage('删除数据库成功');
}
// 插入值
async putPreference(Image:string, ImageInfo: ImageModel) {
if (!preference) {
await this.getPreferencesFromStorage();
}
try {
await preference.put(Image, JSON.stringify(ImageInfo));
} catch (err) {
console.error('[PreferenceModel]', `Failed to put value, Cause: ${err}`);
}
await preference.flush();
}
// 获取值
async getPreference(Image: string) {
let ImageInfo = '';
if (!preference) {
await this.getPreferencesFromStorage();
}
try {
ImageInfo = (await preference.get(Image, '')).toString();
} catch (err) {
console.error('[PreferenceModel]', `Failed to get value, Cause: ${err}`);
}
if (ImageInfo === '') {
this.showToastMessage('数据为空,请先写入数据');
return;
}
this.showToastMessage('写入数据成功');
return JSON.parse(ImageInfo);
}
async getImageData(Image: string) {
return await this.getPreference(Image);
}
// 写入数据
writeData(Image:string, ImageInfo: ImageModel) {
this.putPreference(Image, ImageInfo);
this.showToastMessage('写入数据成功');
}
showToastMessage(message: string) {
promptAction.showToast({
message: message,
duration: 3000
});
};
}
/**
* 操作首选项
*/
export class LocalDataManager {
preferenceModel = new PreferenceModel()
private static localDataManager: LocalDataManager;
private constructor() {
this.preferenceModel.getPreferencesFromStorage()
}
static instance() {
if (!LocalDataManager.localDataManager) {
LocalDataManager.localDataManager = new LocalDataManager();
}
return LocalDataManager.localDataManager;
}
async queryImageInfo(Image:string) {
return await this.preferenceModel.getImageData(Image)
}
insertImageInfo(Image:string, ImageInfo: ImageModel) {
this.preferenceModel.writeData(Image, ImageInfo)
return Image.length
}
updateImageInfo(Image:string, ImageInfo: ImageModel) {
this.preferenceModel.writeData(Image, ImageInfo)
return Image.length
}
deleteImageInfo() {
this.preferenceModel.deletePreferences()
}
}
// 使用首选项做缓存
[@Entry](/user/Entry)
[@Component](/user/Component)
struct NeiMengGuNongJi {
private localDataManager: LocalDataManager = LocalDataManager.instance();
[@State](/user/State) token_Info: string = ''
private img: string = 'image00'
private url: string = 'url000'
[@State](/user/State) num: number = 0
[@State](/user/State) keyInfo: string = ''
[@State](/user/State) imageData: ImageModel = new ImageModel('','','','')
build() {
Column() {
Button('点击存入数据库')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(()=> {
for (let i = 1; i <= 10; i++) {
let tokenInfo = "token00"+i
let image = this.img+i
let urlInfo = this.url+i
let ImageInfo = new ImageModel("", tokenInfo, image, urlInfo);
this.localDataManager.insertImageInfo(image, ImageInfo)
}
})
Button('删除首选项').width(100).height(100)
.onClick(()=>{
this.localDataManager.deleteImageInfo()
})
TextInput({placeholder:'输入key值:例如image001'})
.type(InputType.Normal)
.onChange((key: string) => {
this.keyInfo = key
})
Button('通过key值:'+this.keyInfo+", 获取value值")
.fontSize(18)
.fontWeight(FontWeight.Bold)
.onClick(async()=> {
if(this.keyInfo !== ''){
this.imageData = await this.localDataManager.queryImageInfo(this.keyInfo) as ImageModel
console.info("imageData="+JSON.stringify(this.imageData))
}
})
Text("key: "+this.keyInfo+", value: " + (this.imageData.token === ''? '' : JSON.stringify(this.imageData))).fontSize(40)
}
.width('100%')
}
}
HarmonyOS 鸿蒙Next使用首选项实现持久化的方法如下:
首先,需要导入首选项模块,通常是通过import dataPreference from '@ohos.data.preferences'
或import { preferences } from '@kit.ArkData'
。
接着,获取首选项实例,这通常是一个异步操作,因为需要读写磁盘上的持久化文件。可以通过dataPreferences.getPreferences(context, 'PreferencesName')
来获取,其中context
是上下文信息,'PreferencesName'
是首选项实例的名称。
获取到首选项实例后,就可以使用put
方法写入数据,get
方法读取数据,delete
方法删除数据。注意,写入数据后,如果需要持久化到磁盘,需要调用flush
方法。
此外,首选项的Key为string类型,要求非空且长度有一定限制(如不超过80字节或1024字节,具体取决于鸿蒙版本和API设计)。Value可以是string、number、boolean等类型,大小也有限制。
使用首选项时,需要注意它不适合存放过多的数据,也不支持加密。它主要用于存储轻量级数据,如用户个性化设置等。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。