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