// 单ets页面使用使用用户首选项preference存储持久化数据以及获取示范 存储完成之后可在当前项目全局使用
// 若未封装通用方法则每次使用都需要先获取Preferences实例
import data_preferences from '@ohos.data.preferences';
import common from '@ohos.app.ability.common';
import hilog from '@ohos.hilog';
let myPer = null
@Component
@Entry
export struct SplashPage {
// 注意上下文context只能在@Entry装饰的对象内获取到
context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext
aboutToAppear() {
// 尝试获取到Preferences实例 也可封装方法调用
try {
// 初始化用户首选项实例
let promise = data_preferences.getPreferences(this.context, 'mystore'); // mystore 自定义命名
promise.then((object) => {
myPer = object; //赋值给全局变量myPer,方便后续调用
console.info("Succeeded in getting preferences.");
}).catch((err) => {
console.error("Failed to get preferences. code =" + err.code + ", message =" + err.message);
})
} catch (err) {
console.error("Failed to get preferences. code =" + err.code + ", message =" + err.message);
}
}
putPer() {
// 方法1 不调用myPer直接初始化首选项实例然后使用 可实现 userInfo自定义命名
// data_preferences.getPreferences(this.context, 'userInfo').then(preferences => {
// preferences.put('agree', 1).then(() => {
// preferences.flush()
// })
// })
// 方法2 调用myPer 可实现
let promise = myPer.put('status', 'hello') //存储status,默认值为’hello‘
// 存储之前也可先调用has方法判断是否已存在对应的key,若存在则覆盖,反之则写入,方法参考官网
myPer.flush() // 实例持久化操作
let all = myPer.getAll() // 获取所有的数据
all.then(res => {
console.log(JSON.stringify(res)) // 打印结果 {"status":"hello"}
})
}
getPer() {
// data_preferences.getPreferences(getContext(this), 'userInfo').then(preferences => {
// preferences.get('agree', 0).then(value => {
// // hilog.info(0xF0000, 'dbTest', '%{public}s', value)
// console.log('value=', value)
// })
// })
let promise = myPer.get('status', '0') //这里的0是代表获取不到的时候设置的默认值,必填,可为空
promise.then(res => {
console.log(res) // hello
})
}
build() {
Column() {
Button('put').onClick(() => {
this.putPer()
})
Button('get').onClick(() => {
this.getPer()
})
}
}
}
// 封装方法实现 任意js或者ts文件
// 步骤一 pages/utils/index.ts 我的文件路径
import common from '@ohos.app.ability.common';
import data_preferences from '@ohos.data.preferences'
import defaultAppManager from '@ohos.bundle.defaultAppManager';
class Store {
private preferences;
private context;
set(key: string, val: any) {
this.preferences.put(key, val);
this.preferences.flush(); // 持久化
}
get(key: string) {
return new Promise(async (resolve, reject) => {
if (!this.preferences) {
data_preferences.getPreferences(this.context, 'mystore').then(val => {
console.log('用户首选项初始化成功')
this.preferences = val;
this.preferences.get(key, false, (err, res) => {
if (err) return reject(err)
resolve(res)
})
})
} else {
this.preferences.get(key, false, (err, res) => {
if (err) return reject(err)
resolve(res)
})
}
})
}
delete(key: string) {
this.preferences.delete(key);
this.preferences.flush(); // 持久化
}
initStore(context: common.UIAbilityContext) {
this.context = context;
data_preferences.getPreferences(context, 'mystore').then(val => {
console.log('用户首选项初始化成功')
this.preferences = val;
})
}
}
export default new Store();
// 步骤二 找到ets/entryability/EntryAbility.ts
import 引入前面的index.ts文件
然后在onCreate里面初始化,只需要做这两个操作即可,其余部分未做任何修改 注意路径问题,完整代码如下,
import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';
import useStore from '../pages/utils/Index'
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
useStore.initStore(this.context);
}
onDestroy() {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
}
onWindowStageCreate(windowStage: window.WindowStage) {
// Main window is created, set main page for this ability
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
windowStage.loadContent('pages/Index', (err, data) => {
if (err.code) {
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
return;
}
hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
});
}
onWindowStageDestroy() {
// Main window is destroyed, release UI related resources
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
}
onForeground() {
// Ability has brought to foreground
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
}
onBackground() {
// Ability has back to background
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
}
}
// 步骤三 使用 任意自己的ets文件
// ChildSeven.ets 注意get和set方法的传参不同,因为在前面index.ets内自定义了,可以自己修改和增加其他方法
import router from '@ohos.router';
import useStore from '../utils/Index'
@Component
export struct child7 {
build() {
Column() {
Text('seven')
}
}
}
@Entry
@Component
struct parent {
@State arr: number[] = [10, 20, 30]
async aboutToAppear() {
// 此处获取的status是前面已经存储的status 持久化数据
let status = await useStore.get('status')
console.log('status=', status)
// 存储类型和浏览器的localStorage是一样的
await useStore.set('myData', JSON.stringify(this.arr))
}
build() {
Column() {
Button('change').onClick((event: ClickEvent) => {
// 获取存储的myData
let myData = useStore.get('myData')
myData.then(res => {
console.log('res=', res)
})
})
Divider()
child7()
}
}
}
这就是完整的示范了,附加的其他操作比如数据更新等请看官方文档,小白创作不易,多多点赞支持下。