开始
最近公司和华为签署了合作协议,也就是纯血鸿蒙,我们之前用api9也零零散散写了点东西,发现鸿蒙真的是让各个端都爽了下又没爽够,此处省略一万句。。。。
纯血鸿蒙
所谓纯血鸿蒙,即HarmonyOS NEXT鸿蒙星河版将正式开启Beta,星河版其实就是大家常说的“纯血”鸿蒙,该系统底座全栈自研,去除掉安卓底层代码,不支持打开安卓系统应用,仅支持鸿蒙内核和鸿蒙系统的应用。
开发环境
-
Windows
-
DevEco Studio NEXT Developer Preview2
-
HarmonyOS next Developer Preview2
-
java version "11.0.18" 2023-01-17 LTS
-
hdc 1.2.0a
-
手机:Mate 60Pro (HarmonyOS NEXT Developer Preview2)
HarmonyOS 中的首选项
大家都知道安卓中有共享首选项SharedPreferences,鸿蒙也有ohos.data.preferences (用户首选项),官方是这么对他解释的:用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。接下来我们看看怎么对他使用
使用ohos.data.preferences(用户首选项)
这里有个小坑:api9之前是没有同步的,每次获取数据时候都要 async await一下,非常的不方便,特别是在设置公共参数真的是大坑! 直接上代码:首先定义一个全局的data.preferences(以最新文档同步为例,不用async await),其实name就相当于数据库名称
static getInstance() {
try {
let options: dataPreferences.Options = {
name: 'TestPreferences', //name:Preferences实例的名称。 dataGroupId
dataGroupId: '' // dataGroupId:应用组ID,需要向应用市场获取。为可选参数。指定在此dataGroupId 对应的沙箱路径下创建Preferences实例。当此参数不填时,默认在本应用沙箱目录下创建Preferences实例。
};
preference = dataPreferences.getPreferencesSync(getContext(), options);
} catch (err) {
Logger.error(`Failed to get preferences, Cause: ${err}`);
}
}
存数据:ValueType是一个type类型可以是任意类型的数据,putSync为将数据写入缓存的Preferences实例中,可通过将Preferences实例持久化,此为同步接口,切记一定要flush(),不然不会保存到磁盘,下面的key可以理解成我数据库的其中一个表
static putValue(key: string, value: ValueType) {
try {
if (!preference) {
SPUtils.getInstance();
}
try {
preference.putSync(key, value);
} catch (err) {
Logger.error(`Failed to put value, Cause: ${err}`);
}
preference.flush();
} catch (err) {
Logger.error(`Failed to get preferences, Cause: ${err}`);
}
}
获取数据:从缓存的Preferences实例中获取键对应的值,如果值为null或者非默认值类型,返回默认数据defValue,此为同步接口,建议这个只获取基本类型的数据,因为后面我单独写了个获取对象的方法
/**
* 获取基本类型
* @param key
* @param defaultValue
* @returns
*/
static getValue(key: string, defaultValue: ValueType = "") {
let value: string = '';
if (!preference) {
SPUtils.getInstance();
}
try {
value = (preference.getSync(key, defaultValue)).toString();
} catch (err) {
Logger.error(`Failed to get value, Cause: ${err}`);
}
return value;
}
获取对象类型数据:其实就是做了下JSON.parse最终返回一个泛型,不说了,直接上代码!
static get<T>(key: string, defaultValue: ValueType = "") {
let value: T | null = null;
if (!preference) {
SPUtils.getInstance();
}
try {
const json = SPUtils.getValue(key, defaultValue)
if (json) {
value = JSON.parse(json) as T
}
} catch (err) {
Logger.error(`Failed to get value, Cause: ${err}`);
}
return value;
}
下面我单独写操作数据相关的示例(存数组类型):
存数组:
let test = [
new Test({ parms: '66666' }),
new Test({ parms: '7777777' }),
// 添加更多的实例...
] as Test[];
SPUtils.putValue("test", JSON.stringify(test))
获取数组类型:
获取数组:
const testArray = SPUtils.get("test", '') as Test[]
AlertDialog.show({
message: `测试信息:${JSON.stringify(testArray[0].parms + '===' + testArray[1].parms)} `
})
存对象类型:
let test =new Test({ parms: '66666' }) as Test;
SPUtils.putValue("test", JSON.stringify(test))
获取对象:
const info = SPUtils.get("test", '') as Test
AlertDialog.show({
message: `测试信息:${JSON.stringify(info.parms} `
存基本数据类型(string number boolean):
SPUtils.putValue("test", '测试') || SPUtils.putValue("test", 12222) || SPUtils.putValue("test", true)
获取基本数据类型
const info = SPUtils.get("test", '') ||const info = SPUtils.get("test", 0) ||const info = SPUtils.get("test", false)
AlertDialog.show({
message: `测试信息:${JSON.stringify(info} `
})
移除指定key
static removeValue(key: string) {
try {
if (!preference) {
SPUtils.getInstance();
}
try {
preference.deleteSync(key);
} catch (err) {
Logger.error(`Failed to put value, Cause: ${err}`);
}
preference.flush();
} catch (err) {
Logger.error(`Failed to get preferences, Cause: ${err}`);
}
}
删除所有数据:
static clearValue() {
try {
if (!preference) {
SPUtils.getInstance();
}
try {
preference.clearSync();
} catch (err) {
Logger.error(`Failed to put value, Cause: ${err}`);
}
preference.flush();
} catch (err) {
Logger.error(`Failed to get preferences, Cause: ${err}`);
}
}
总结:
好了,就到这了,上面是我简单的写了个用户首选项的基本用法,其实AppStorage也可以用来存取数据,个人比较喜欢用首选项,AppStorage好像有个坑,在EntryAbility里面不能获取数据,不知道华为修复这个bug没,后面我会继续给大家分享系列的鸿蒙相关实战,包括各种踩坑,网络请求封装系列之类的,首页渐变效果,节后见!
本文正在参加华为鸿蒙有奖征文征文活动