在ArkData(方舟数据管理)中,根据数据特点,数据持久化存储的方式有以下三种:
1、用户首选项(Preferences):
对于Key和Value有一些限制:
Key为string类型,非空且长度<=80个字节;
Value为string时,长度<=8192个字节;
建议存储的数据不超过1万条;
类似iOS的UserDefaults或者Android的SharedPreference,提供了轻量级配置数据的持久能力;
支持订阅数据变化的通知能力;
不支持分布式同步,常用于保存应用配置信息、用户偏好设置等;
会将文本中的数据全量加载到内存中,访问快,效率高,但不适合存储大量数据
接口说明
用户首选项和iOS的UserDefault,Android的SharedPreference的使用方法很像,都有基本的增、删、改、查方法,但不同的是用户首选项提供了订阅数据变更的能力:
// 获取Preferences实例。该接口存在异步接口。
getPreferencesSync(context: Context, options: Options): Preferences
// 将数据写入Preferences实例,可通过flush将Preferences实例持久化。该接口存在异步接口。
putSync(key: string, value: ValueType): void
// 检查Preferences实例是否包含名为给定Key的存储键值对。给定的Key值不能为空。该接口存在异步接口。
hasSync(key: string): void
// 获取键对应的值,如果值为null或者非默认值类型,返回默认数据defValue。该接口存在异步接口。
getSync(key: string, defValue: ValueType): void
// 从Preferences实例中删除名为给定Key的存储键值对。该接口存在异步接口。
deleteSync(key: string): void
// 将当前Preferences实例的数据异步存储到用户首选项持久化文件中。
flush(callback: AsyncCallback<void>): void
// 订阅数据变更,订阅的数据发生变更后,在执行flush方法后,触发callback回调。
on(type: 'change', callback: Callback<string>): void
// 取消订阅数据变更。
off(type: 'change', callback?: Callback<string>): void
// 从内存中移除指定的Preferences实例。若Preferences实例有对应的持久化文件,则同时删除其持久化文件。
deletePreferences(context: Context, options: Options, callback: AsyncCallback<void>): void
举例说明
// 导入包
import dataPreferences from '@ohos.data.preferences';
// 获取context
let context = getContext(this);
export default class PreferencesManager {
static shared = new PreferencesManager();
preferences?: dataPreferences.Preferences;
preferencesName: string = 'CommonPreferences';
// 初始化preferences实例
initPreferences() {
this.preferences = dataPreferences.getPreferencesSync(context, { name: this.preferencesName });
}
// 设置数据
set(key: string, value: dataPreferences.ValueType) {
if (!this.preferences) {
this.initPreferences();
}
this.preferences?.putSync(key, value);
this.preferences?.flush();
}
// 获取数据
get(key: string): dataPreferences.ValueType | null | undefined {
if (!this.preferences) {
this.initPreferences();
}
let value = this.preferences?.getSync(key, null);;
return value;
}
// 删除数据
delete(key: string) {
if (!this.preferences) {
this.initPreferences();
}
if (this.preferences?.hasSync(key)) {
this.preferences.deleteSync(key);
this.preferences.flush();
}
}
}
2.键值型数据库
键值型数据库用于存储键值对形式的数据,适用于简单的存储场景:比如存储商品名称及对应价格、员工工号及今日是否已出勤等。
针对于单版本数据库,针对每条记录,Key的长度<=1KB,Value的长度<4MB;
设备协同数据库,针对每条记录,Key的长度<=896 Byte, Value的长度<4MB;
每个应用程序最多支持同时打开16个键值型分布式数据库;
键值型数据库事件回调方法中不允许进行阻塞操作,例如修改UI组件;
接口说明
键值型数据库相关的接口,大部分为异步接口,均有callback和Promise两种返回形式。
// 创建一个KVManager对象实例,用于管理数据库对象
createKVManager(config: KVManagerConfig): KVManager
// 指定Options和storeId,创建并得到指定类型的KVStore数据库
getKVStore<T>(storeId: string, options: Options, callback: AsyncCallback<T>): void
// 添加指定类型的键值对到数据库
put(key: string, value: Uint8Array|string|number|boolean, callback: AsyncCallback<void>): void
// 获取指定键的值
get(key: string, callback: AsyncCallback<Uint8Array|string|boolean|number>): void
// 从数据库中删除指定键值的数据
delete(key: string, callback: AsyncCallback<void>): void
举例说明
// 导入模块
import distributedKVStore from '@ohos.data.distributedKVStore';
// 获取context
let context = getContext(this);
export default class KVStoreManager {
// 单例模式
static shared = new KVStoreManager();
// SingleKVStore实例
KVStore?: distributedKVStore.SingleKVStore;
// 创建并获取KVStore
async initKVStore() {
try {
// Create KVManager
let bundleName = await getBundleName();
const kvManagerConfig: distributedKVStore.KVManagerConfig = {
context: context,
bundleName: bundleName
};
const manager = distributedKVStore.createKVManager(kvManagerConfig);
// Create KVStore
const options: distributedKVStore.Options = {
createIfMissing: true,
encrypt: false,
backup: false,
autoSync: false,
kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
securityLevel: distributedKVStore.SecurityLevel.S1
};
this.KVStore = await manager.getKVStore<distributedKVStore.SingleKVStore>('storeId', options);
} catch (error) {
console.log('[KVStoreManager]', `Failed to initKVStore, Cause: ${error}`);
}
}
// 插入数据
async set(key: string, value: Uint8Array | string | number | boolean) {
if (!this.KVStore) {
await this.initKVStore();
}
try {
await this.KVStore?.put(key, value);
} catch (error) {
console.log('[KVStoreManager]', `Failed to set value, Cause: ${error}`);
}
}
// 获取数据
async get(key: string): Promise<string | number | boolean | Uint8Array | null | undefined> {
if (!this.KVStore) {
await this.initKVStore();
}
let value: Uint8Array | string | number | boolean | null | undefined = null;
try {
return this.KVStore?.get(key);
} catch (error) {
console.log('[KVStoreManager]', `Failed to get value, Cause: ${error}`);
}
return value;
}
// 删除数据
async delete(key: string) {
if (!this.KVStore) {
await this.initKVStore();
}
try {
await this.KVStore?.delete(key);
} catch (error) {
console.log('[KVStoreManager]', `Failed to delete value, Cause: ${error}`);
}
}
}