一、运作机制
二、约束限制
- Key键为string类型,要求非空且长度不超过80个字节。
- 如果Value值为string类型,请使用UTF-8编码格式,可以为空,不为空时长度不超过8192个字节。
- 内存会随着存储数据量的增大而增大,所以存储的数据量应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销。
三、接口说明
四、使用尝试
为了更优雅的使用Preferences,我们可以用class定义一个类之后,再去使用
首先在目录common-PreferencesUtil中新建PreferencesUtil.ts
1、定义class
引入Preferences,通过Map来实现多个Preferences场景,内部定义增删改查方法,完成后导出
typescript
import preferences from '@ohos.data.preferences';
class PreferencesUtils {
prefMap: Map<string, preferences.Preferences> = 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名称
typescript
// 加载数据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方法,刷盘后,才能实现持久化
typescript
// 新增数据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
typescript
// 读取数据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
typescript
// 删除数据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));
}
}
完成代码如下
typescript
import preferences from '@ohos.data.preferences';
class PreferencesUtils {
prefMap: Map<string, preferences.Preferences> = 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
javascript
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')
}
需要使用的文件中数据读取数据
typescript
import PreferencesUtils from '../../common/MyPerference/MyPerference'
async aboutToAppear() {
this.isShow = await PreferencesUtils.getPreferenceValue('MyPreference', 'isShow', '') as boolean
}
put、del方法同理
PS:持久化效果在预览器中不生效,仅在模拟机以及真机中有效