应用数据持久化,是指应用将内存中的数据通过文件或数据库的形式保存到设备上。内存中的数据形态通常是任意的数据结构或数据对象,存储介质上的数据形态可能是文本、数据库、二进制文件等。
1.使用场景
简单点说,关闭app后重新打开app需要保持的数据可以称为需要持久化的数据。如记录喝水量的应用,重新打开app后要读取持久化数据,恢复上一次的喝水量。
2.鸿蒙上持久化数据类型
持久化数据类型分为三种:用户首选项、键值对数据库以及关系型数据库
3.用户首选项(Preferences)
官方介绍:用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据,当需要持久化时可以使用flush接口将内存中的数据写入持久化文件中。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据,也不支持通过配置加密,适用的场景一般为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等。
通俗点说是一个键值对形式的文件。由于文件是持久化的,不会因为进程被杀掉后被清除,所以轻量级的键值对数据可以存储在Preferences里面。
preferences使用时一般要封装一个工具类,对外提供init、set、get、delete接口
3.1 init接口 主要是传入文件的名字和context
async initPreference(storeName: string, context?: Context): Promise<void> {
return preferences.getPreferences(context, storeName)
.then((preferences: preferences.Preferences) => {
this.preferences = preferences;
});
}
3.2 set接口 存值
async setValue<T>(key: string, value: T): Promise<void> {
if (this.preferences) {
this.preferences.put(key, JSON.stringify(value)).then(() => {
this.saveUserData();
})
} else {
this.initPreference(PREFERENCES_NAME, this.mContext!!).then(() => {
this.setValue<T>(key, value);
});
}
}
3.3 get接口 取值
async getValue<T>(key: string): Promise<T | null> {
if (this.preferences) {
return this.preferences.get(key, '').then((res: preferences.ValueType) => {
let value: T | null = null;
if (res) {
value = JSON.parse(res as string) as T;
}
return value;
});
} else {
return this.initPreference(PREFERENCES_NAME, this.mContext!!).then(() => {
return this.getValue<T>(key);
});
}
}
3.4 delete接口 删除值
async deleteValue(key: string): Promise<void> {
if (this.preferences) {
this.preferences.delete(key).then(() => {
this.saveUserData();
});
} else {
this.initPreference(PREFERENCES_NAME, this.mContext!!).then(() => {
this.deleteValue(key);
});
}
}
3.5 preference文件存储位置
其中要特别注意的是init接口参数的context,这个对应preference文件的存放位置。
如果是application的context,那么文件是存放在包的根目录下,如图
如果是ability的context,对应的位置就是在对应hap下,如图
3.6 preference文件格式
打开对应的preference文件,可以看到是xml格式的键值对数据
<?xml version="1.0" encoding="UTF-8"?>
<preferences version="1.0">
<string key="key_curDrink">400</string>
<string key="key_drinkImage">""</string>
<string key="key_drinkName">"水"</string>
<string key="key_drinkOnce">100</string>
<string key="key_totalDrink">10000</string>
</preferences>