【鸿蒙开发实战】鸿蒙中如何通过关系型数据库实现数据持久化

前言

软件要求

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)
}
}

在鸿蒙操作系统中,我的应用程序提供了两种笔记删除方式:

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)全栈开发资料用来跟着学习是非常有必要的。

获取完整版高清学习资料,请点击→鸿蒙全栈开发学习资料(安全链接,请放心点击)

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了

最新鸿蒙全栈开发学习线路在这里插入图片描述

鸿蒙HarmonyOS开发教学视频

在这里插入图片描述

大厂面试真题

在这里插入图片描述

在这里插入图片描述

鸿蒙OpenHarmony源码剖析

在这里插入图片描述

这份资料能帮住各位小伙伴理清自己的学习思路,更加快捷有效的掌握鸿蒙开发的各种知识。有需要的小伙伴自行领取,,先到先得~无套路领取!!

获取这份完整版高清学习资料,请点击→鸿蒙全栈开发学习资料(安全链接,请放心点击)

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值