Ark TS 用户首选项Preferences实现数据持久化 | 您所在的位置:网站首页 › prmac首选项 › Ark TS 用户首选项Preferences实现数据持久化 |
一、运作机制
Key键为string类型,要求非空且长度不超过80个字节。 如果Value值为string类型,请使用UTF-8编码格式,可以为空,不为空时长度不超过8192个字节。 内存会随着存储数据量的增大而增大,所以存储的数据量应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销。 三、接口说明为了更优雅的使用Preferences,我们可以用class定义一个类之后,再去使用 首先在目录common-PreferencesUtil中新建PreferencesUtil.ts 1、定义class引入Preferences,通过Map来实现多个Preferences场景,内部定义增删改查方法,完成后导出 import preferences from '@ohos.data.preferences'; class PreferencesUtils { prefMap: Map = new Map() // 加载数据load loadPrefenence(context, name: string) {} // 新增数据put putPreferenceValue(name: string, key: string, value: preferences.ValueType) {} // 读取数据get getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType) {} // 删除数据del delPreferenceValue(name: string,key: string) {} } const preferenceUtils = new PreferencesUtils() export default preferenceUtils as PreferencesUtils 2、完善方法加载数据 传入上下文context,以及自定义的Preferences名称 // 加载数据load async loadPrefenence(context, name: string) { try { const pref = await preferences.getPreferences(context, name) this.prefMap.set(name, pref) console.log('testTag', `加载preferences[${name}]成功`) } catch (e) { console.log('testTag', `加载preferences[${name}]失败`, JSON.stringify(e)); } }新增数据 传入自定义的Preferences名称,需要存储的key-value键值对 put方法在调用的时候,若key已存在则会覆盖原有数据 注意:新增的数据必须调用flush方法,刷盘后,才能实现持久化 // 新增数据put async putPreferenceValue(name: string, key: string, value: preferences.ValueType) { // 先判断是否存在该名称的键值对 if (!this.prefMap.has(name)) { console.log('testTag', `preferences[${name}]尚未初始化`); return } try { const pref = this.prefMap.get(name) // 写入数据 await pref.put(key, value) // 刷盘 await pref.flush() console.log('testTag', `保存preferences[${name}]成功`) } catch (e) { console.log('testTag', `保存preferences[${name}]失败`, JSON.stringify(e)); } }读取数据 传入自定义的Preferences名称,需要读取的key,若首次读取时没有改数据,则给默认数据defaultValue // 读取数据get async getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType) { // 先判断是否存在该名称的键值对 if (!this.prefMap.has(name)) { console.log('testTag', `preferences[${name}]尚未初始化`); return } try { const pref = this.prefMap.get(name) const value = await pref.get(key, defaultValue) console.log('testTag', `读取preferences[${name}.${key}=${value}]成功`) return value } catch (e) { console.log('testTag', `读取preferences[${name}]失败`, JSON.stringify(e)); } }删除数据 传入自定义的Preferences名称,需要删除的key // 删除数据del async delPreferenceValue(name: string,key: string) { // 先判断是否存在该名称的键值对 if (!this.prefMap.has(name)) { console.log('testTag', `preferences[${name}]尚未初始化`); return } try { const pref = this.prefMap.get(name) await pref.delete(key) console.log('testTag', `删除preferences[${name}]成功`) } catch (e) { console.log('testTag', `删除preferences[${name}]失败`, JSON.stringify(e)); } }完成代码如下 import preferences from '@ohos.data.preferences'; class PreferencesUtils { prefMap: Map = new Map() // 加载数据load async loadPrefenence(context, name: string) { try { const pref = await preferences.getPreferences(context, name) this.prefMap.set(name, pref) console.log('testTag', `加载preferences[${name}]成功`) } catch (e) { console.log('testTag', `加载preferences[${name}]失败`, JSON.stringify(e)); } } // 新增数据put async putPreferenceValue(name: string, key: string, value: preferences.ValueType) { // 先判断是否存在该名称的键值对 if (!this.prefMap.has(name)) { console.log('testTag', `preferences[${name}]尚未初始化`); return } try { const pref = this.prefMap.get(name) // 写入数据 await pref.put(key, value) // 刷盘 await pref.flush() console.log('testTag', `保存preferences[${name}]成功`) } catch (e) { console.log('testTag', `保存preferences[${name}]失败`, JSON.stringify(e)); } } // 读取数据get async getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType) { // 先判断是否存在该名称的键值对 if (!this.prefMap.has(name)) { console.log('testTag', `preferences[${name}]尚未初始化`); return } try { const pref = this.prefMap.get(name) const value = await pref.get(key, defaultValue) console.log('testTag', `读取preferences[${name}.${key}=${value}]成功`) return value } catch (e) { console.log('testTag', `读取preferences[${name}]失败`, JSON.stringify(e)); } } // 删除数据del async delPreferenceValue(name: string, key: string) { // 先判断是否存在该名称的键值对 if (!this.prefMap.has(name)) { console.log('testTag', `preferences[${name}]尚未初始化`); return } try { const pref = this.prefMap.get(name) await pref.delete(key) console.log('testTag', `删除preferences[${name}]成功`) } catch (e) { console.log('testTag', `删除preferences[${name}]失败`, JSON.stringify(e)); } } } const preferenceUtils = new PreferencesUtils() export default preferenceUtils as PreferencesUtils 3、使用在EntryAbility.ts入口文件中,找到onCreate生命周期钩子,初始化Preferences import PreferencesUtils from '../common/MyPerference/MyPerference' async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); // 初始化preference PreferencesUtils.loadPrefenence(this.context, 'MyPreference') }需要使用的文件中数据读取数据 import PreferencesUtils from '../../common/MyPerference/MyPerference' async aboutToAppear() { this.isShow = await PreferencesUtils.getPreferenceValue('MyPreference', 'isShow', '') as boolean }put、del方法同理 PS:持久化效果在预览器中不生效,仅在模拟机以及真机中有效 |
CopyRight 2018-2019 实验室设备网 版权所有 |