鸿蒙开发之EventHub与键值型数据库

139 阅读4分钟

EventHub

当你页面嵌套组件多的时候,数据的及时更新就是一个难题,这个时候,你就可以使用EventHub,他类似于线程通信,可以做到信息改变的时候触发,EventHub,你值得拥有

下面是封装好的方法,比官网的更简介,更容易看懂

let context = getContext(this)
let eventhub = context.eventHub

export class EventHubUtil{
  //触发事件
  static emit(name: string, params: Object){
    eventhub.emit(name, params)
  }
  //订阅事件
  static on(name:string,callback:Function){
    eventhub.on(name,callback)
  }
  //取消订阅事件
  static off(name:string,callback?:Function){
    eventhub.off(name,callback)
  }
}

使用方式

/*
 * 事件订阅需要触发条件(例如数据改变,类似于监听),但是也需要订阅
 * 例如,我可以在页面开始的时候就开始订阅,这样的话,只要触发,我就能操作
 * - 记得使用模拟器或者是真机,预览器实现不了
 * */
import { EventHubUtil } from "../../utils/EventHubUtils"


@Component
export struct EventhubPage {
  @State msg:Array<string>=['这是初始化数据,当点击的时候我会利用EventHub新增一条数据']
  @State isTrue:boolean=false  //例如,我可以定义一个布尔值,当值改变的时候触发订阅事件
  build() {
    Column(){
      ForEach(this.msg,(item:string)=>{
        Text(item)
      })
        Button('点击即可利用EventHub新增一条数据')
          .onClick(()=>{
            this.isTrue=!this.isTrue
            EventHubUtil.emit('Eventhub',this.isTrue)
          })
    }
  }
  aboutToAppear(): void {
    EventHubUtil.on('Eventhub',()=>{
      this.msg.push('如果触发成功,则会触发,新添加一条数据')
    })
    //可以在页面开始的时候就订阅
  }
  aboutToDisappear(): void {
    EventHubUtil.off('Eventhub')
  }
}

相信各位大哥大姐都已经看懂了,当页面初始化的时候订阅,当数据更改的时候触发,他也可以进行数据的传递。

属实是简单好用

数据持久化之键值型数据库

在进行鸿蒙开发的时候,查看官方文档的时候发现键值型数据库描述的并不是很清晰,没有很好的帮助开发者快速理解并且使用,而且官方文档给的方案是在项目初始化的时候就初始化数据库(需要修改多个地方),但是本人比较懒,希望封装一下,在需要的时候直接调用就行,翻遍了各个社区,突然觉得还是自己封装一下比较好,于是结合各位大佬的案例,我的封装就诞生了

以下是代码部分:

import { relationalStore, ValuesBucket } from '@kit.ArkData'

/*
 * 创建人:宫一
 * 邮箱:17835606871@163.com
 * 创建日期:2024年9月27日
 * 方法说明:键值型数据库存储工具封装类
 */


// 隐私笔记的类型
export interface PrivacyNoteDBInfo extends ValuesBucket {
  id: number | null // 新增时 id 设置为 null ,可实现 id 自增
  origin:string//起点
  destination:string//终点
  transits:string//方案 转成JSON字符串,方便存储
}

// 隐私笔记数据库封装
class PrivacyNoteDB {
  // 操作数据库的实例
  private store: relationalStore.RdbStore | null = null
  // 数据库表名
  private tableName = 'ROUTE_INFO'
  // 创建数据库的语句
  private sqlCreate = `CREATE TABLE IF NOT EXISTS ${this.tableName} (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        origin TEXT NOT NULL,
        destination TEXT NOT NULL,
        transits TEXT NOT NULL
      )`

  // 获取数据库操作的实例
  async getStoreInstance() {
    // 如果 store 已保存,直接返回即可,不让再重新创建/打开了(性能优化)
    if (this.store) {
      return this.store
    }
    this.store = await relationalStore.getRdbStore(getContext(), {
      name: 'guardian.db',
      securityLevel: relationalStore.SecurityLevel.S1
    })
    return this.store
  }

  constructor() {
    // 创建/打开数据库文件  建表
    this.getStoreInstance().then(store => store.executeSql(this.sqlCreate))
  }

  // 新增数据
  async insert(value: PrivacyNoteDBInfo) {
    // 创建/打开数据库文件
    const store = await this.getStoreInstance()
    return store.insert(this.tableName, value)
  }

  // 查询数据
  async query(id?: number) {
    // 创建/打开数据库文件
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    if (id) {
      // 如果有id的话,查询当前的数据
      predicates.equalTo('id', id)
    } else {
      predicates.orderByDesc('id')
    }
    const resultSet = await store.query(predicates)
    const list: PrivacyNoteDBInfo[] = []
    while (resultSet.goToNextRow()) {
      // 获取当前行  getRow
      const item = resultSet.getRow() as PrivacyNoteDBInfo
      list.push(item)
    }
    // 释放内存
    resultSet.close()
    return list
  }

  // 删除数据
  async delete(id: number) {
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('id', id)
    return await store.delete(predicates)
  }

  // 修改数据
  async update(value: PrivacyNoteDBInfo) {
    if (!value.id) {
      Promise.reject()
    }
    const store = await this.getStoreInstance()
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('id', value.id)
    return store.update(value, predicates)
  }
}

// 通过小写 p 开头的类实例操作数据库,创建数据库,建表,增、删、查、改
export const privacyNoteDB = new PrivacyNoteDB()

使用方法:

……

太多就不展示了,文章的末尾会有我的git地址,里面会有demo,大家可以下载跳转查看,里面内容详细,不会的直接留言

简略写一下:在需要的时候直接调用即可,当然如果各位小可爱想用的话还是需要修改一部分内容的,想必大家应该接触过数据库(典型的MySQL,SQLserver...),知道数据库的结构是什么样的,咱们修改的部分也很简单,就是需要的字段,把字段修改成自己所需要的,顺带着把字段的数据类型修改,恭喜你,你的牛批项目可以键值型数据库了

注:不会不要紧,多研究研究就会了

如果大家发现有问题,直接ping我就对了,感谢

此次demo案例的git地址为:https://gitee.com/gong-wenxiang/hongmengshili.git