HarmonyOS系统应用持久化技术工具包及封装组件
文章目录
一、preferences:首选项
preferences()首选项通常用于保存应用的配置信息key-Value格式。如:保存用户的个性化设置(字体大小,是否开启夜间模式)等
***preferences中的value中的类型支持:数字型、字符型、布尔型及3中类型的数组
通过文本的形式保存在设备中,应用使用过程中会将文本中的数据全量加载到内存中,所以访问速度快、效率高,
但不适合需要存储大量数据的场景。
应用首选项的持久化文件保存至物理文件,需要到虚拟机沙箱才有,外部看不到
使用方法:
1.导包: import preferences from '@ohos.data.preferences'
2.创建实例: getPreferences(context: Context, name: string): Promise<Preferences>
例: this.store = preferences.getPreferences(getContext(this),'自定配置的名字userStore') // 异步的 返回值为:Promise<Preferences>
3.获取数据: get(key: string, defValue: ValueType): Promise<ValueType>
例: const res = await this.store.get(key,'') // 当没有数据时,默认''
await this.store.flush()
4.修改数据: put(key: string, value: ValueType): Promise<void>
例: await this.store.put(key,value) //支持 数字型number、字符型string、布尔型boolean及3中类型的数组
await this.store.flush()
5.删除数据: delete(key: string): Promise<void>
await this.store.delete(key)
await this.store.flush()
6.当每个业务执行完成记得: .flush() // 刷新(防止文件挂起)
首选项工具包
import preferences from '@ohos.data.preferences';
// 工具
export class ConfigStore {
private fileName:string = 'myConfig'
// 构造器方法
constructor(fileName?:string) {
if(fileName){
this.fileName = fileName
}
}
//首选项实例
private getStore() {
let store= preferences.getPreferences( getContext(this), this.fileName )
return preferences.getPreferences( getContext(this), this.fileName )
}
//设置
async setData(key:string, data:string){
const store = await this.getStore()
await store.put(key, data)
await store.flush()
}
//检索
async getData(key:string){
const store = await this.getStore()
const data = await store.get(key, '') //统一默认类型,没有就是空字符串
await store.flush()
return JSON.stringify(data) //始终统一返回字符串格式,哪怕是一个对象描述
}
//删除
async delData(key:string){
const store = await this.getStore()
await store.delete(key)
await store.flush()
}
}
首选项工具包(单例模式:懒汉式)
import preferences from '@ohos.data.preferences';
// 工具
/**
* 使用单例模式 // 减少资源的占用
* 1.将构造进行私有(私有)
* 2.创建静态私有实例(私有)
* 3.封装公用使用对象(公用) ==初始化实例校验
*/
export default class PreferencesHelper {
// 1.将构造进行私有(私有)
private static pre: PreferencesHelper
// 2.创建静态私有实例(私有)
private constructor(fileName?: string) {
if (fileName) {
this.fileName = fileName
}
}
// 3.封装公用使用对象(公用)==初始化实例校验
public static getInstance(): PreferencesHelper { // public 不加默认共用
// 懒汉模式
// 饿汉模式是在私有上直接实例,但是不用则会占用资源
if (!PreferencesHelper.pre) {
PreferencesHelper.pre = new PreferencesHelper()
}
return PreferencesHelper.pre
}
// 下面使用必须要基于单例模式===封装信息
private readonly fileName: string = 'myConfig'
private getStore():Promise<preferences.Preferences>{
return preferences.getPreferences(getContext(this), this.fileName)
}
//设置
async putData(key: string, data: string):Promise<void> {
try {
const store = await this.getStore()
await store.put(key, data)
await store.flush()
}catch (err){
throw new Error(err)
}
}
//检索
async getData(key: string) {
const store = await this.getStore()
const data = await store.get(key, '') //统一默认类型,没有就是空字符串
await store.flush()
return JSON.stringify(data) //始终统一返回字符串格式,哪怕是一个对象描述
}
//删除
async delData(key: string):Promise<void> {
try {
const store = await this.getStore()
await store.delete(key)
await store.flush()
} catch (err){
throw new Error(err)
}
}
}
首选项工具包–卡片开发使用
import dataPreferences from '@ohos.data.preferences';
import Logger from '@ohos.hilog';
const TAG = 1;
const MY_STORE = 'myStore';
const FORM_ID = 'formIds';
// 注意:需要将这个文件改成后缀名为.ets,否则Context会报错
export class PreferencesUtil {
private static preferencesUtil: PreferencesUtil;
public static getInstance(): PreferencesUtil {
if (!PreferencesUtil.preferencesUtil) {
PreferencesUtil.preferencesUtil = new PreferencesUtil();
}
return PreferencesUtil.preferencesUtil;
}
getPreferences(context: Context): Promise<dataPreferences.Preferences> {
return new Promise((resolve, reject) => {
dataPreferences.getPreferences(context, MY_STORE, (err, pref: dataPreferences.Preferences) => {
if (err) {
Logger.error(TAG, `Failed to get preferences. Code:${err.code},message:${err.message}`,"");
reject(err);
return;
}
resolve(pref);
})
})
}
preferencesFlush(preferences: dataPreferences.Preferences) {
preferences.flush((err) => {
if (err) {
Logger.error(TAG, `Failed to flush. Code:${err.code}, message:${err.message}`,"");
}
})
}
preferencesPut(preferences: dataPreferences.Preferences, formIds: Array<string>): Promise<boolean> {
return new Promise((resolve, reject) => {
try {
preferences.put(FORM_ID, formIds, (err) => {
if (err) {
reject(err);
Logger.error(TAG, `Failed to put data. Code:${err.code}, message:${err.message}`,"");
return;
}
Logger.info(TAG, `preferencesPut succeed,formIds: ${JSON.stringify(formIds)}`,"");
resolve(true);
})
} catch (error) {
Logger.error(TAG, `Failed to put data. Code: ${error.code},
message:${error.message}`,"");
}
});
}
async preferencesHas(preferences: dataPreferences.Preferences): Promise<boolean> {
return new Promise((resolve, reject) => {
preferences.has(FORM_ID, (err, value) => {
if (err) {
reject(err);
Logger.error(TAG, `WANG to check the key 'formIds'. Code:${err.code}, message:${err.message}`,"");
return;
}
resolve(value);
});
})
}
removePreferencesFromCache(context: Context): void {
dataPreferences.removePreferencesFromCache(context, MY_STORE);
}
async getFormIds(context: Context): Promise<Array<string>> {
try {
let preferences = await this.getPreferences(context);
return new Promise((resolve, reject) => {
if (preferences === null) {
Logger.error(TAG, `preferences is null`,"");
return;
}
preferences.get(FORM_ID, [''], (err, value) => {
if (err) {
reject(err);
Logger.error(TAG, `Failed to get value of 'formIds'. Code:${err.code}, message:${err.message}`,"");
return;
}
resolve(value as Array<string>);
Logger.info(TAG, `Succeeded in getting value of 'formIds'. val: ${value}.`,"");
})
})
} catch (error) {
Logger.error(TAG, `WANG Failed to get value of 'formIds'. Code:${error.code},
message:${error.message}`,"");
}
return new Promise((resolve, reject) => {})
}
async addFormId(context: Context, formId: string) {
try {
let preferences = await this.getPreferences(context);
if (preferences === null) {
Logger.error(TAG, `preferences is null`,"");
return;
}
if (await this.preferencesHas(preferences)) {
let formIds = await this.getFormIds(context);
console.log('formIds:',formIds)
if (formIds.indexOf(formId) === -1) {
formIds.push(formId);
if (!await this.preferencesPut(preferences, formIds)) {
return;
}
this.preferencesFlush(preferences);
}
} else {
if (!await this.preferencesPut(preferences, [formId])) {
return;
}
this.preferencesFlush(preferences);
}
} catch (error) {
Logger.error(TAG, `Failed to check the key 'formIds'. Code:${error.code},
message:${error.message}`,"");
}
}
async removeFormId(context: Context, formId: string) {
try {
let preferences = await this.getPreferences(context);
if (preferences === null) {
Logger.error(TAG, `preferences is null`,"");
return;
}
if (await this.preferencesHas(preferences)) {
let formIds = await this.getFormIds(context);
let index = formIds.indexOf(formId);
if (index !== -1) {
formIds.splice(index, 1);
}
if (!await this.preferencesPut(preferences, formIds)) {
return;
}
this.preferencesFlush(preferences);
}
} catch (error) {
Logger.error(TAG, `WANG Failed to get preferences. Code:${error.code},
message:${error.message}`,"");
}
}
}
二、relationalStore:关系型数据库RDB
操作步骤:
1.导包:
import relationalStore from "@ohos.data.relationalStore" --相当于获取驱动
2. 声明数据库连接:
private store: relationalStore.RdbStore = {} as relationalStore.RdbStore
3.设置连接信息(使用的同步 await 记得在函数上加 async)
this.store = await relationalStore.getRdbStore(
getContext(this),
{ name: "test.db",// 不存在则会创建
securityLevel: relationalStore.SecurityLevel.S1 } // S1是最低等级,权限越低操作的权限越大
4.删除库:
// 一般在恢复出厂设置使用
//await 同步要记得try catch 防止错误,可能会存在等级问题,删除错误
await relationalStore.deleteRdbStore(getContext(this), "test.db")
// 删除操作声明赋值为空
this.store = {} as relationalStore.RdbStore
///
// CRUD 操作
// await this.store.insert() C
// await this.store.delete() D
// await this.store.update() U
// await this.store.querySql() R
1.创建表
let sql = `create table if not existes "user"(
id integer primary key autoincrement,
name varchar(20)
....
)`
// 执行sql,但此函数没有返回值,并且支持正常的CRUD 中的C U D 操作
await this.store.executeSql(sql)
2. 删除表,若表不存在也不会报错
sql = `drop table if existes "user"`
await this.store.executeSql(sql)
3.查询语句:
const resR: relationalStore.ResultSet = await this.store.querySql("select * from user")
// 获取结果集的方法:
//方式一:for循环
resR.goToFirstRow();// 必须要有
for (let index = 0; index < resR.rowCount; index++) { // 注意循环条件
const id = resR.getLong(0) // 获取id的数据
const name = resR.getString(resR.getColumnIndex("name")) // 当不知道索引则使用这种方法
resR.goToNextRow()// 完成下移一行
}
// 方式二 while循环 : while 则不使用resR.goToFirstRow()
while (resR.goToNextRow()) { //默认开始
const id = resR.getLong(0) // 获取id的数据
const name = resR.getString(resR.getColumnIndex("name")) // 当不知道索引则使用这种方法
}
relational工具包(单例模式)
// 减少资源的占用
import relationalStore from '@ohos.data.relationalStore'
class DBHelper { //使用单例模式
// 定义连接
private store: relationalStore.RdbStore = {} as relationalStore.RdbStore
config: relationalStore.StoreConfig = { name: 'system.db', securityLevel: relationalStore.SecurityLevel.S1 }
// 私有构造不让调用
private constructor() {}
// 私有静态类
private static dbHelper: DBHelper
// 静态公用初始化,供外界调用
public static initialization(): DBHelper {
if (!DBHelper.dbHelper) {
DBHelper.dbHelper = new DBHelper()
}
return DBHelper.dbHelper
}
// 连接数据库,和初始化
async creteStore() {
//默认异步创建连接
this.store = await relationalStore.getRdbStore(getContext(this), this.config)
console.info('system==>系统执行数据库创建成功!')
}
// 执行语言
async execDML(sql: string, params?: Array<relationalStore.ValueType>): Promise<void> {
try {
console.info('system==>系统执行sql: execDML():' + sql, `参数:${!params ? '执行无参' : JSON.stringify(params)}`)
params ? await this.store.executeSql(sql, params) : await this.store.executeSql(sql)
} catch (err) {
console.error('system==>系统执行sql错误execDML():' + sql, `参数:${!params ? '执行无参' : JSON.stringify(params)}`)
throw new Error(err)
}
}
// 查询语言
async execDQL(sql: string, params?: Array<relationalStore.ValueType>): Promise<relationalStore.ResultSet> {
try {
console.info('system==>系统执行sql:execDQL():' + sql, `参数:${!params ? '执行无参' : JSON.stringify(params)}`)
return params ? await this.store.querySql(sql, params) : await this.store.querySql(sql)
} catch (err) {
console.error('system==>系统执行sql错误execDQL():' + sql, `参数:${!params ? '执行无参' : JSON.stringify(params)}`)
throw new Error(err)
}
}
// 重置或者初始化数据库
async intoDataBase(): Promise<void> {
await relationalStore.deleteRdbStore(getContext(this), this.config.name)
}
}
export default DBHelper
ORM(对象关系映射) 工具包
介绍: 使用方式和java中的mabatis-plus类似,只是将底层的做了一个封装,需要结合interface和class进行使用。
*** 对象和数据之间都是驼峰命名法。但数据库的操作不会自动去转换格式如:class:bookName == sql:book_name 需要人工去对应
import relationalStore from '@ohos.data.relationalStore'
export class DBManager {
// 定义连接
store: relationalStore.RdbStore = {} as relationalStore.RdbStore
config: relationalStore.StoreConfig = { name: 'text.db', securityLevel: relationalStore.SecurityLevel.S1 }
// 连接数据库,和初始化
constructor() {
//默认异步创建连接
relationalStore.getRdbStore(getContext(this), this.config, (err, store) => {
if (err) {
console.info('连接错误')
return
}
//赋值
this.store = store
console.info('连接对象创建成功!')
})
}
// 创建单独一条/单个
async insertSingle(table: string, values: relationalStore.ValuesBucket): Promise<number> {
try {
return await this.store.insert(table, values)
} catch (err) {
// throw (err) // 错误抛出异常 高版本不支持的
throw new Error(err)
}
}
// 创建多个批量添加数据
async batchInsert(table: string, values: Array<relationalStore.ValuesBucket>): Promise<number> {
try {
return await this.store.batchInsert(table, values)
}
catch (err) {
throw new Error(err)
}
}
// 删除功能
async delete(predicates: relationalStore.RdbPredicates): Promise<number> {
try {
return await this.store.delete(predicates)
} catch (err) {
throw new Error(err)
}
}
//变更
async update(values: relationalStore.ValuesBucket, predicates: relationalStore.RdbPredicates): Promise<number> {
try {
return await this.store.update(values, predicates)
} catch (err) {
throw new Error(err)
}
}
// 查询
async getDataList(predicates: relationalStore.RdbPredicates, columns?: Array<string>): Promise<relationalStore.ResultSet> {
try {
if (columns && columns.length > 0) {
return await this.store.query(predicates, columns)
} else {
return await this.store.query(predicates)
}
} catch (err) {
throw new Error(err)
}
}
}