当前位置:   article > 正文

Ark TS @ohos.data.relationalStore (关系型数据库)实现数据本地持久化_arkts数据库操作

arkts数据库操作
一、官方介绍

关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。不支持Worker线程。 ArkTS侧支持的基本数据类型:number、string、二进制类型数据、boolean。为保证插入并读取数据成功,建议一条数据不要超过2M。超出该大小,插入成功,读取失败。

该模块提供以下关系型数据库相关的常用功能:

  • RdbPredicates: 数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
  • RdbStore:提供管理关系数据库(RDB)方法的接口。
  • ResultSet:提供用户调用关系型数据库查询接口之后返回的结果集合。

二、准备阶段

1、准备一个数据类

用@Observe装饰器是因为需要跟使用的页面进行双向的数据绑定,定义了id跟name两个变量

  1. @Observed
  2. export default class TaskInfo {
  3. id: number
  4. name: string
  5. constructor(id: number, name: string) {
  6. this.id = id
  7. this.name = name
  8. }
  9. }

2、在common目录下新建rdbStore.ets文件

定义一个TaskModel类,定义初始化、读取、新增、删除来完善数据库的功能

  1. class TaskModel {
  2. // 初始化任务表
  3. initTaskDB(context) {}
  4. // 查询任务表
  5. getTaskList() {}
  6. /*
  7. * 添加新任务
  8. * @param name 任务名称
  9. * @return 任务id
  10. * */
  11. addTask(name: string) {}
  12. /*
  13. * 根据id更新任务状态
  14. * @param id 任务id
  15. * */
  16. updataTaskStatus(id: number, name: string) {}
  17. /*
  18. * 根据id删除任务
  19. * @param id 任务id
  20. * */
  21. deleteTaskById(id: number) {}
  22. }
  23. const taskModel = new TaskModel()
  24. export default taskModel as TaskModel
初始化table

配置rdb,取名+设置安全级别

初始化sql语句,创建一个table

import relationalStore from '@ohos.data.relationalStore';

通过引入的relationalStore的getRdbStore获取rdb

private rdbStore: relationalStore.RdbStore

并在初始化之后,保存rdbStore,以供后面的方法使用

  1. // 初始化任务表
  2. initTaskDB(context) {
  3. // 1、rdb配置
  4. const config = {
  5. name: 'MyAppRdbStore.db',
  6. // 设置数据库的安全级别s1 s2 s3 s4 从低到高
  7. securityLevel: relationalStore.SecurityLevel.S1
  8. }
  9. // 2、初始化sql语句
  10. const sql = `CREATE TABLE IF NOT EXISTS TASK (
  11. ID INTEGER PRIMARY KEY AUTOINCREMENT,
  12. NAME TEXT NOT NULL
  13. )`
  14. // 3、获取rdb
  15. relationalStore.getRdbStore(context, config, (err, rdbStore) => {
  16. if (err) {
  17. console.log('testTag', '获取rdbStore失败')
  18. return
  19. }
  20. // 执行sql
  21. rdbStore.executeSql(sql)
  22. console.log('testTag', '创建task表成功')
  23. // 保存rdbStore
  24. this.rdbStore = rdbStore
  25. })
  26. }
查询
  1. import TaskInfo from '../../common/rdbStore/taskModel'
  2. class TaskModel {
  3. private tableName: string = 'TASK'
  4. }

引入提前准备的数据类,并自定义table的name

  1. // 查询任务表
  2. async getTaskList() {
  3. // 1.构建查询条件
  4. const predicates = new relationalStore.RdbPredicates(this.tableName)
  5. // 2.查询
  6. const result = await this.rdbStore.query(predicates, ['ID', 'NAME'])
  7. // 3.解析查询结果
  8. // 3.1 定义一个数组,用于组装最终的查询结果,导入事先准备好的TaskInfo类
  9. const tasks: TaskInfo[] = []
  10. // 3.2 遍历封装
  11. while (!result.isAtLastRow) {
  12. // 3.3 指针移动到下一行
  13. result.goToNextRow()
  14. // 3.4 获取数据
  15. const id = result.getLong(result.getColumnIndex('ID'))
  16. const name = result.getString(result.getColumnIndex('NAME'))
  17. // 封装到数组
  18. tasks.push({ id, name })
  19. }
  20. console.log('testTag', '查询到数据', JSON.stringify(tasks));
  21. return tasks
  22. }
新增
  1. /*
  2. * 添加新任务
  3. * @param name 任务名称
  4. * @return 任务id
  5. * */
  6. addTask(name: string): Promise<number> {
  7. console.log('testTag', '新增的数据', name);
  8. return this.rdbStore.insert(this.tableName, { name })
  9. }
更新
  1. /*
  2. * 根据id更新任务状态
  3. * @param id 任务id
  4. * */
  5. updataTaskStatus(id: number, name: string) {
  6. // 1. 要更新的数据
  7. const data = { name }
  8. // 2. 要更新的条件
  9. const predicates = new relationalStore.RdbPredicates(this.tableName)
  10. predicates.equalTo('ID', id)
  11. // 3. 更新操作
  12. return this.rdbStore.update(data, predicates)
  13. }
删除
  1. /*
  2. * 根据id删除任务
  3. * @param id 任务id
  4. * */
  5. deleteTaskById(id: number) {
  6. // 1. 删除的条件
  7. const predicates = new relationalStore.RdbPredicates(this.tableName)
  8. predicates.equalTo('ID', id)
  9. // 2. 删除操作
  10. return this.rdbStore.delete(predicates)
  11. }
完整的代码
  1. import relationalStore from '@ohos.data.relationalStore';
  2. import TaskInfo from '../../common/rdbStore/taskModel'
  3. class TaskModel {
  4. private rdbStore: relationalStore.RdbStore
  5. private tableName: string = 'TASK'
  6. // 初始化任务表
  7. initTaskDB(context) {
  8. // 1、rdb配置
  9. const config = {
  10. name: 'MyAppRdbStore.db',
  11. // 设置数据库的安全级别s1 s2 s3 s4 从低到高
  12. securityLevel: relationalStore.SecurityLevel.S1
  13. }
  14. // 2、初始化sql语句
  15. const sql = `CREATE TABLE IF NOT EXISTS TASK (
  16. ID INTEGER PRIMARY KEY AUTOINCREMENT,
  17. NAME TEXT NOT NULL
  18. )`
  19. // 3、获取rdb
  20. relationalStore.getRdbStore(context, config, (err, rdbStore) => {
  21. if (err) {
  22. console.log('testTag', '获取rdbStore失败')
  23. return
  24. }
  25. // 执行sql
  26. rdbStore.executeSql(sql)
  27. console.log('testTag', '创建task表成功')
  28. // 保存rdbStore
  29. this.rdbStore = rdbStore
  30. })
  31. }
  32. // 查询任务表
  33. async getTaskList() {
  34. // 1.构建查询条件
  35. const predicates = new relationalStore.RdbPredicates(this.tableName)
  36. // 2.查询
  37. const result = await this.rdbStore.query(predicates, ['ID', 'NAME'])
  38. // 3.解析查询结果
  39. // 3.1 定义一个数组,用于组装最终的查询结果,导入事先准备好的TaskInfo类
  40. const tasks: TaskInfo[] = []
  41. // 3.2 遍历封装
  42. while (!result.isAtLastRow) {
  43. // 3.3 指针移动到下一行
  44. result.goToNextRow()
  45. // 3.4 获取数据
  46. const id = result.getLong(result.getColumnIndex('ID'))
  47. const name = result.getString(result.getColumnIndex('NAME'))
  48. // 封装到数组
  49. tasks.push({ id, name })
  50. }
  51. console.log('testTag', '查询到数据', JSON.stringify(tasks));
  52. return tasks
  53. }
  54. /*
  55. * 添加新任务
  56. * @param name 任务名称
  57. * @return 任务id
  58. * */
  59. addTask(name: string): Promise<number> {
  60. console.log('testTag', '新增的数据', name);
  61. return this.rdbStore.insert(this.tableName, { name })
  62. }
  63. /*
  64. * 根据id更新任务状态
  65. * @param id 任务id
  66. * */
  67. updataTaskStatus(id: number, name: string) {
  68. // 1. 要更新的数据
  69. const data = { name }
  70. // 2. 要更新的条件
  71. const predicates = new relationalStore.RdbPredicates(this.tableName)
  72. predicates.equalTo('ID', id)
  73. // 3. 更新操作
  74. return this.rdbStore.update(data, predicates)
  75. }
  76. /*
  77. * 根据id删除任务
  78. * @param id 任务id
  79. * */
  80. deleteTaskById(id: number) {
  81. // 1. 删除的条件
  82. const predicates = new relationalStore.RdbPredicates(this.tableName)
  83. predicates.equalTo('ID', id)
  84. // 2. 删除操作
  85. return this.rdbStore.delete(predicates)
  86. }
  87. }
  88. const taskModel = new TaskModel()
  89. export default taskModel as TaskModel
三、使用

1、在EntryAbility.ets(需要把文件后缀改为ets文件)中的onCreate钩子中传入context初始化table

  1. import TaskModel from '../common/rdbStore/rdbStore'
  2. onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
  3. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  4. // 初始化TaskModel
  5. TaskModel.initTaskDB(this.context)
  6. }

2、使用的页面,仅调用了方法,并未实现页面功能

  1. import TaskModel from '../../common/rdbStore/rdbStore'
  2. import TaskInfo from '../../common/rdbStore/taskModel'
  3. @Entry
  4. @Component
  5. struct SearchExample {
  6. @State hisSearchArr: TaskInfo[] = []
  7. aboutToAppear() {
  8. TaskModel.getTaskList().then((tasks) => {
  9. this.hisSearchArr = tasks
  10. console.log('testTag', JSON.stringify(this.hisSearchArr), '查询到的数据')
  11. }).catch((e) => [
  12. console.log('testTag', e, '查询失败')
  13. ])
  14. }
  15. // 新增数据
  16. addTask(value: string) {
  17. TaskModel.addTask(value).then(id => {
  18. this.hisSearchArr.push(new TaskInfo(id, value))
  19. console.log('testTag', JSON.stringify(this.hisSearchArr), '更新后的数据')
  20. }).catch((e) => [
  21. console.log('testTag', '新增失败', JSON.stringify(e))
  22. ])
  23. }
  24. build() {
  25. Column() {
  26. }.width('100%')
  27. }
  28. }

删除、更新操作同理

PS:

1、ts文件不能被ets文件引用,同理,ets文件也不能被ts文件引用

2、持久化效果在预览器中不生效,仅在模拟机以及真机中有效

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/264481?site
推荐阅读
相关标签
  

闽ICP备14008679号