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

一、官方介绍

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

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

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

二、准备阶段

1、准备一个数据类

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

@Observed
export default class TaskInfo {
  id: number
  name: string

  constructor(id: number, name: string) {
    this.id = id
    this.name = name
  }
}

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

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

class TaskModel {
  // 初始化任务表
  initTaskDB(context) {}
  // 查询任务表
  getTaskList() {}
  /*
   * 添加新任务
   * @param name 任务名称
   * @return 任务id
   * */
  addTask(name: string) {}
  /*
* 根据id更新任务状态
* @param id 任务id
* */
  updataTaskStatus(id: number, name: string) {}
  /*
* 根据id删除任务
* @param id 任务id
* */
  deleteTaskById(id: number) {}
}

const taskModel = new TaskModel()

export default taskModel as TaskModel
初始化table

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

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

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

通过引入的relationalStore的getRdbStore获取rdb

private rdbStore: relationalStore.RdbStore

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

// 初始化任务表
  initTaskDB(context) {
    // 1、rdb配置
    const config = {
      name: 'MyAppRdbStore.db',
      // 设置数据库的安全级别s1 s2 s3 s4 从低到高
      securityLevel: relationalStore.SecurityLevel.S1
    }
    // 2、初始化sql语句
    const sql = `CREATE TABLE IF NOT EXISTS TASK (
                  ID INTEGER PRIMARY KEY AUTOINCREMENT,
                  NAME TEXT NOT NULL
                 )` 
    // 3、获取rdb
    relationalStore.getRdbStore(context, config, (err, rdbStore) => {
      if (err) {
        console.log('testTag', '获取rdbStore失败')
        return
      }
      // 执行sql
      rdbStore.executeSql(sql)
      console.log('testTag', '创建task表成功')

      // 保存rdbStore
      this.rdbStore = rdbStore
    })
  }
查询
import TaskInfo from '../../common/rdbStore/taskModel'

class TaskModel {
  private tableName: string = 'TASK'
}

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

// 查询任务表
  async getTaskList() {
    // 1.构建查询条件
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    // 2.查询
    const result = await this.rdbStore.query(predicates, ['ID', 'NAME'])
    // 3.解析查询结果
    // 3.1 定义一个数组,用于组装最终的查询结果,导入事先准备好的TaskInfo类
    const tasks: TaskInfo[] = []
    // 3.2 遍历封装
    while (!result.isAtLastRow) {
      // 3.3 指针移动到下一行
      result.goToNextRow()
      // 3.4 获取数据
      const id = result.getLong(result.getColumnIndex('ID'))
      const name = result.getString(result.getColumnIndex('NAME'))
      // 封装到数组
      tasks.push({ id, name })
    }
    console.log('testTag', '查询到数据', JSON.stringify(tasks));
    return tasks
  }
新增
 /*
   * 添加新任务
   * @param name 任务名称
   * @return 任务id
   * */
  addTask(name: string): Promise<number> {
    console.log('testTag', '新增的数据', name);
    return this.rdbStore.insert(this.tableName, { name })
  }
更新
  /*
* 根据id更新任务状态
* @param id 任务id
* */
  updataTaskStatus(id: number, name: string) {
    // 1. 要更新的数据
    const data = { name }
    // 2. 要更新的条件
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('ID', id)
    // 3. 更新操作
    return this.rdbStore.update(data, predicates)
  }
删除
  /*
* 根据id删除任务
* @param id 任务id
* */
  deleteTaskById(id: number) {
    // 1. 删除的条件
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('ID', id)
    // 2. 删除操作
    return this.rdbStore.delete(predicates)
  }
完整的代码
import relationalStore from '@ohos.data.relationalStore';
import TaskInfo from '../../common/rdbStore/taskModel'

class TaskModel {
  private rdbStore: relationalStore.RdbStore
  private tableName: string = 'TASK'

  // 初始化任务表
  initTaskDB(context) {
    // 1、rdb配置
    const config = {
      name: 'MyAppRdbStore.db',
      // 设置数据库的安全级别s1 s2 s3 s4 从低到高
      securityLevel: relationalStore.SecurityLevel.S1
    }
    // 2、初始化sql语句
    const sql = `CREATE TABLE IF NOT EXISTS TASK (
                  ID INTEGER PRIMARY KEY AUTOINCREMENT,
                  NAME TEXT NOT NULL
                 )` 
    // 3、获取rdb
    relationalStore.getRdbStore(context, config, (err, rdbStore) => {
      if (err) {
        console.log('testTag', '获取rdbStore失败')
        return
      }
      // 执行sql
      rdbStore.executeSql(sql)
      console.log('testTag', '创建task表成功')

      // 保存rdbStore
      this.rdbStore = rdbStore
    })
  }

  // 查询任务表
  async getTaskList() {
    // 1.构建查询条件
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    // 2.查询
    const result = await this.rdbStore.query(predicates, ['ID', 'NAME'])
    // 3.解析查询结果
    // 3.1 定义一个数组,用于组装最终的查询结果,导入事先准备好的TaskInfo类
    const tasks: TaskInfo[] = []
    // 3.2 遍历封装
    while (!result.isAtLastRow) {
      // 3.3 指针移动到下一行
      result.goToNextRow()
      // 3.4 获取数据
      const id = result.getLong(result.getColumnIndex('ID'))
      const name = result.getString(result.getColumnIndex('NAME'))
      // 封装到数组
      tasks.push({ id, name })
    }
    console.log('testTag', '查询到数据', JSON.stringify(tasks));
    return tasks
  }

  /*
   * 添加新任务
   * @param name 任务名称
   * @return 任务id
   * */
  addTask(name: string): Promise<number> {
    console.log('testTag', '新增的数据', name);
    return this.rdbStore.insert(this.tableName, { name })
  }

  /*
* 根据id更新任务状态
* @param id 任务id
* */
  updataTaskStatus(id: number, name: string) {
    // 1. 要更新的数据
    const data = { name }
    // 2. 要更新的条件
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('ID', id)
    // 3. 更新操作
    return this.rdbStore.update(data, predicates)
  }

  /*
* 根据id删除任务
* @param id 任务id
* */
  deleteTaskById(id: number) {
    // 1. 删除的条件
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('ID', id)
    // 2. 删除操作
    return this.rdbStore.delete(predicates)
  }
}

const taskModel = new TaskModel()

export default taskModel as TaskModel
三、使用

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

import TaskModel from '../common/rdbStore/rdbStore'

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');

    // 初始化TaskModel
    TaskModel.initTaskDB(this.context)
  }

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

import TaskModel from '../../common/rdbStore/rdbStore'
import TaskInfo from '../../common/rdbStore/taskModel'

@Entry
@Component
struct SearchExample {
  @State hisSearchArr: TaskInfo[] = []

  aboutToAppear() {
    TaskModel.getTaskList().then((tasks) => {
      this.hisSearchArr = tasks
      console.log('testTag', JSON.stringify(this.hisSearchArr), '查询到的数据')
    }).catch((e) => [
    console.log('testTag', e, '查询失败')
    ])
  }

  // 新增数据
  addTask(value: string) {
    TaskModel.addTask(value).then(id => {
      this.hisSearchArr.push(new TaskInfo(id, value))
      console.log('testTag', JSON.stringify(this.hisSearchArr), '更新后的数据')
    }).catch((e) => [
    console.log('testTag', '新增失败', JSON.stringify(e))
    ])
  }

  build() {
    Column() {

    }.width('100%')
  }
}

删除、更新操作同理

PS:

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

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

  • 28
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要解压 tar.xz 文件,首先需要安装 xz 解压工具,可以使用以下命令安装: ``` sudo apt-get install xz-utils ``` 如果已经安装了 xz 解压工具,则可以使用以下命令解压 tar.xz 文件: ``` tar xvJf 文件名.tar.xz ``` 其中,x 表示解压,v 表示显示详细信息,J 表示使用 xz 解压,f 表示文件名称。 ### 回答2: 在Linux系统中,我们可以使用以下命令来解压.tar.xz文件: 1. 首先,我们需要确认系统是否已安装了xz-utils工具包。可以通过以下命令来检查: ``` sudo apt-get install xz-utils ``` 2. 一旦确认安装了xz-utils工具包,我们可以使用以下命令来解压.tar.xz文件: ``` tar -xf 文件名.tar.xz ``` 这将会将文件解压到当前目录。 如果你想将文件解压到特定的目录,可以使用如下命令: ``` tar -xf 文件名.tar.xz -C 目标目录 ``` 其中,文件名.tar.xz是你想要解压的.tar.xz文件的名称,目标目录是你想要解压到的目录的路径。 请注意,以上命令中的选项解释如下: - x:表示解压文件。 - f:表示要解压的文件名在命令行中指定。 - C:表示解压到指定的目录。 通过执行以上的命令,你就可以成功地解压.tar.xz文件了。 ### 回答3: 在Linux中,解压tar.xz文件是一个相对简单的过程。可以使用两种方法来实现: 1. 使用命令行:打开终端,并导航至tar.xz文件所在的目录。然后输入以下命令: ``` tar -xvf 文件名.tar.xz ``` 这会以详细模式解压tar.xz文件。解压后的文件将保存在当前目录下。 2. 使用图形界面工具:如果您更喜欢使用图形界面来操作,可以使用压缩软件,如File Roller或Ark。这些工具通常会预装在大多数Linux发行版中。您可以通过在文件管理器中右键单击tar.xz文件并选择“提取到...”或类似选项来解压文件。然后选择要保存解压文件的目标文件夹,并点击“提取”按钮。 在两种方法中,解压后的文件将被还原到tar.xz文件所在的目录下。您可以通过使用`ls`命令检查解压的文件是否在目标目录中。 请注意,tar.xz文件通常是通过使用`tar`命令打包多个文件或目录并通过`xz`命令进行压缩而创建的。因此,在解压tar.xz文件后,您将获得原始的文件或目录。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值