鸿蒙通过关系型数据库实现数据持久化总结
软件要求
DevEco Studio 版本:构建版本:5.0.3.100
API Version : 11 Release
官方参考文档:HarmonyOS NEXT
利用关系型数据库SQLite实现笔记数据持久化功能
关系型数据库基于SQLite组件,适用于存储包含复杂关系数据的场景,比如一个班级的学生信息,需要包括姓名、学号、各科成绩等,又或者公司的雇员信息,需要包括姓名、工号、职位等,由于数据之间有较强的对应关系,复杂程度比键值型数据更高,此时需要使用关系型数据库来持久化保存数据。
使用SQLite为App打造笔记功能
两个基本概念:
- 谓词:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
- 结果集:指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便地拿到用户想要的数据。
使用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
}
}
利用SQLite数据库为应用程序添加笔记功能
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'
}
}
利用SQLite数据库为应用程序查询笔记列表
模拟器效果,如下:
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
}
}
利用SQLite数据库为应用程序修改笔记内容
模拟器效果,如下:
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)
}
}
利用SQLite数据库删除笔记
模拟器效果,如下:
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)
}
}
在鸿蒙操作系统中,我的应用程序提供了两种笔记删除方式:
- 在列表项的末尾,我使用了
ListItem
组件的.swipeAction()
方法来实现一个滑动删除功能,用户可以通过滑动操作来触发删除按钮。 - 另外,我还实现了一种基于用户滑动距离的删除机制,在
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的交互性,也增强了用户对隐私保护的信心。
此外,我们还讨论了如何在鸿蒙系统中设置可选参数,以及如何通过生命周期方法来增强用户体验。这些实践展示了鸿蒙操作系统在提供现代化、用户友好的界面和功能方面的潜力。
在未来,随着技术的不断进步和用户需求的不断变化,我们可以预见,鸿蒙操作系统将继续引领移动应用开发的趋势,为用户带来更多创新和价值。作为开发者,我们应当不断探索和学习,以确保我们的应用程序能够满足用户的需求。
转载自:https://juejin.cn/post/7374307181481656374