HarmonyOS系统应用持久化技术工具包及封装组件

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类似,只是将底层的做了一个封装,需要结合interfaceclass进行使用。
*** 对象和数据之间都是驼峰命名法。但数据库的操作不会自动去转换格式如: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)
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大众筹码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值