赞
踩
关系型数据库基于SQLite组件,适用于存储包含复杂关系数据的场景,比如一个班级的学生信息,需要包括姓名、学号、各科成绩等,又或者公司的雇员信息,需要包括姓名、工号、职位等,由于数据之间有较强的对应关系,复杂程度比键值型数据更高,此时需要使用关系型数据库来持久化保存数据。
两个基本概念:
谓词:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
结果集:指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便地拿到用户想要的数据。
使用Stage模型,官方Stage模型示例,如下图:
├── database // 数据库
│ └── PrivacyNoteDB.ets
├── Privacy // 隐私空间
│ ├── PrivacySettingsPage.ets
│ ├── Note
│ │ └── NoteIndexPage.ets // 隐私笔记主页
│ │ ├── NoteFormPage.ets // 隐私笔记表单页
在模拟器中App的笔记入口页面,如下图:
使用关系型数据库实现数据持久化,需要获取一个RdbStore
封装代码如下:
export interface PrivacyNoteDBInfo extends ValuesBucket { id: number | null title: string content: string date_added: number } class PrivacyNoteDB { private store: relationalStore.RdbStore | null = null private tableName = 'privacy_note' private sqlCreate = `CREATE TABLE IF NOT EXISTS ${this.tableName} ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT NOT NULL, date_added INTEGER NOT NULL )` async getStoreInstance() { if (this.store) { return this.store } const store = await relationalStore.getRdbStore(getContext(), { name: this.tableName + '.db', securityLevel: relationalStore.SecurityLevel.S1 }) store.executeSql(this.sqlCreate) this.store = store return this.store } }
PrivacyNoteDB 里面继续添加如下代码,封装代码如下:
class PrivacyNoteDB { //代码续接 // 新增笔记 async insert(value: PrivacyNoteDBInfo) { const store = await this.getStoreInstance() return store.insert(this.tableName, value) } // 查询笔记总数 async queryCount() { const store = await this.getStoreInstance() const predicates = new relationalStore.RdbPredicates(this.tableName) const resultSet = await store.query(predicates) return resultSet.rowCount > 0 ? resultSet.rowCount : 0 } }
注意:由于笔记可能会新增或删除,数量都有变化,所以需要在生命周期页面显示 onPageShow 时,重新获取数量
//PrivacySettingsPage.ets
onPageShow(): void {
this.getDBCount()
}
async getDBCount() {
this.list[1] = {
icon: $r('app.media.ic_notebook'),
name: '笔记',
count: await privacyNoteDB.queryCount(),
url: 'pages/Privacy/Note/NoteIndexPage'
}
}
模拟器效果,如下:
PrivacyNoteDB 里面继续添加如下代码,封装代码如下:
class PrivacyNoteDB { //代码续接 //查询列表 async query() { const store = await this.getStoreInstance() const predicates = new relationalStore.RdbPredicates(this.tableName) predicates.orderByDesc('id') const resultSet = await store.query(predicates) const list: PrivacyNoteDBInfo[] = [] while (resultSet.goToNextRow()) { list.push({ id: resultSet.getLong(resultSet.getColumnIndex('id')), title: resultSet.getString(resultSet.getColumnIndex('title')), content: resultSet.getString(resultSet.getColumnIndex('content')), date_added: resultSet.getLong(resultSet.getColumnIndex('date_added')), }) } return list } }
在鸿蒙操作系统中,当用户在编辑新笔记时,如果标题字段不为空,并且用户尝试通过返回操作退出编辑界面,系统会触发一个提示,询问用户是否要放弃当前编辑的笔记。这个提示是通过生命周期方法onBackPress()来实现的。
在鸿蒙操作系统中,当需要展示特定笔记的详细信息时,可以通过路由传递参数的方式来实现。
模拟器效果,如下:
//NoteFormPage.ets aboutToAppear(): void { const params = router.getParams() as RouterParams if (params) { this.routerParams = params this.getDetail() } } async getDetail() { const list = await privacyNoteDB.query(this.routerParams.id) const detail = list[0] if (detail) { this.title = detail.title this.content = detail.content } }
模拟器效果,如下:
class PrivacyNoteDB { //代码续接 async update(value: Partial<PrivacyNoteDBInfo>) { if (!value.id) { return Promise.reject('id error') } // 获取操作数据库的对象 const store = await this.getStoreInstance() // 谓词(条件) const predicates = new relationalStore.RdbPredicates(this.tableName) // 添加 id 作为限定条件 predicates.equalTo('id', value.id) // 更新数据 return store.update(value, predicates) } }
模拟器效果,如下:
class PrivacyNoteDB { //代码续接 async delete(id: number) { // 如果没有 id 直接退出 if (!id) { return Promise.reject('id error') } // 获取操作数据库的对象 const store = await this.getStoreInstance() // 谓词(条件) const predicates = new relationalStore.RdbPredicates(this.tableName) // 添加 id 作为限定条件 predicates.equalTo('id', id) // 删除数据 return store.delete(predicates) } }
在鸿蒙操作系统中,我的应用程序提供了两种笔记删除方式:
1.在列表项的末尾,我使用了ListItem组件的.swipeAction()方法来实现一个滑动删除功能,用户可以通过滑动操作来触发删除按钮。
2.另外,我还实现了一种基于用户滑动距离的删除机制,在onAction事件中,当用户滑动达到一定距离时,笔记将被自动删除。
//NoteIndexPage.ets
.swipeAction({
end: {
builder: () => {
this.swipeActionEnd(item.id)
},
actionAreaDistance: 60,
onAction: () => {
this.deleteById(item.id)
},
},
edgeEffect: SwipeEdgeEffect.None
})
随着鸿蒙操作系统的不断发展和完善,开发者们有机会利用其强大的功能和灵活的API为用户带来更加丰富和个性化的体验。在本文中,我们探讨了如何通过SQLite数据库实现App中的隐私笔记功能,以及如何在鸿蒙系统中实现笔记的删除操作,包括末尾删除按钮和基于滑动距离的自动删除。
通过ListItem组件的.swipeAction()方法,我们为用户带来了直观且易于使用的滑动删除体验,而onBackPress()生命周期方法的应用则确保了用户在编辑过程中的笔记安全,通过提示确认来避免意外数据丢失。这些功能的实现不仅提升了App的交互性,也增强了用户对隐私保护的信心。
此外,我们还讨论了如何在鸿蒙系统中设置可选参数,以及如何通过生命周期方法来增强用户体验。这些实践展示了鸿蒙操作系统在提供现代化、用户友好的界面和功能方面的潜力。
在未来,随着技术的不断进步和用户需求的不断变化,我们可以预见,鸿蒙操作系统将继续引领移动应用开发的趋势,为用户带来更多创新和价值。作为开发者,我们应当不断探索和学习,以确保我们的应用程序能够满足用户的需求。
有很多小伙伴不知道该从哪里开始学习鸿蒙开发技术?也不知道鸿蒙开发的知识点重点掌握的又有哪些?自学时频繁踩坑,导致浪费大量时间。结果还是一知半解。所以有一份实用的鸿蒙(HarmonyOS NEXT)全栈开发资料用来跟着学习是非常有必要的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。