Harmony鸿蒙应用开发——关系型数据库(RelationalStore)

这篇具有很好参考价值的文章主要介绍了Harmony鸿蒙应用开发——关系型数据库(RelationalStore)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本概念

关系型数据库基于SQLite组件,适用于存储包含复杂关系数据的场景,比如一个班级的学生信息,需要包括姓名、学号、各科成绩等,又或者公司的雇员信息,需要包括姓名、工号、职位等,由于数据之间有较强的对应关系,复杂程度比键值型数据更高,此时需要使用关系型数据库来持久化保存数据。

接口说明

以下是关系型数据库持久化功能的相关接口,大部分为异步接口。异步接口均有callback和Promise两种返回形式,下表均以callback形式为例,更多接口及使用方式请见关系型数据库。

接口名称

描述

getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback<RdbStore>): void

获得一个相关的RdbStore,操作关系型数据库,用户可以根据自己的需求配置RdbStore的参数,然后通过RdbStore调用相关接口可以执行相关的数据操作。

executeSql(sql: string, bindArgs: Array<ValueType>, callback: AsyncCallback<void>):void

执行包含指定参数但不返回值的SQL语句。

insert(table: string, values: ValuesBucket, callback: AsyncCallback<number>):void

向目标表中插入一行数据。

update(values: ValuesBucket, predicates: RdbPredicates, callback: AsyncCallback<number>):void

根据RdbPredicates的指定实例对象更新数据库中的数据。

delete(predicates: RdbPredicates, callback: AsyncCallback<number>):void

根据RdbPredicates的指定实例对象从数据库中删除数据。

query(predicates: RdbPredicates, columns: Array<string>, callback: AsyncCallback<ResultSet>):void

根据指定条件查询数据库中的数据。

deleteRdbStore(context: Context, name: string, callback: AsyncCallback<void>): void

删除数据库。

快速使用指南

1. 导入模块

import relationalStore from '@ohos.data.relationalStore'; // 导入模块 

2. 获得一个相关的RdbStore

在项目文件中的EntryAbility

Harmony鸿蒙应用开发——关系型数据库(RelationalStore),数据库,harmonyos,oracle

在该代码的生命周期函数onWindowStageCreat中添加代码:

const STORE_CONFIG = {
      name: 'RdbTest.db', // 数据库文件名
      securityLevel: relationalStore.SecurityLevel.S1 // 数据库安全级别
    };

    relationalStore.getRdbStore(this.context, STORE_CONFIG, (err, store) => {
      if (err) {
        console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
        return;
      }
      console.info(`Succeeded in getting RdbStore.`);

    });

relationalStore.getRdbStore接口说明:

getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback<RdbStore>): void

获得一个相关的RdbStore,操作关系型数据库,用户可以根据自己的需求配置RdbStore的参数,然后通过RdbStore调用相关接口可以执行相关的数据操作,使用callback异步回调。

参数:

参数名

类型

必填

说明

context

Context

应用的上下文。

FA模型的应用Context定义见Context。

Stage模型的应用Context定义见Context。

config

StoreConfig

与此RDB存储相关的数据库配置。

callback

AsyncCallback<RdbStore>

指定callback回调函数,返回RdbStore对象。

在该代码中:STORE_CONFIG为数据库的配置参数,更详细的说明在官方文档,在执行getRdbStore时,需要提供context,以及配置参数。

当执行getRdbStore后,通过回调函数获取到RdbStore(store)对象,该对象可以用来操作数据库,如创建数据库,增删改查、创建数据表等操作。

注意:

  • 应用创建的数据库与其上下文(Context)有关,即使使用同样的数据库名称,但不同的应用上下文,会产生多个数据库,例如每个UIAbility都有各自的上下文。
  • 当应用首次获取数据库(调用getRdbStore)后,在应用沙箱内会产生对应的数据库文件。使用数据库的过程中,在与数据库文件相同的目录下可能会产生以-wal和-shm结尾的临时文件。此时若开发者希望移动数据库文件到其它地方使用查看,则需要同时移动这些临时文件,当应用被卸载完成后,其在设备上产生的数据库文件及临时文件也会被移除。

3. 创建RdbUtils工具包

为了方便我们后面在UI中操作数据库,我们在项目文件中创建common/rdbUtils/RdbUtils.ts文件,作为数据库操作工具包:

Harmony鸿蒙应用开发——关系型数据库(RelationalStore),数据库,harmonyos,oracle

代码如下:

import relationalStore from '@ohos.data.relationalStore';
export default class RdbUtils {
  private static rdbStore: relationalStore.RdbStore;
  static setStore(store: relationalStore.RdbStore) {
    RdbUtils.rdbStore = store;
  }
  static getStore(): relationalStore.RdbStore {
    return RdbUtils.rdbStore;
  }
}

之后,我们需要在刚才的EntryAbility中的生命周期函数onWindowStageCreat中添加RdbUtils.setStore(store),代码如下:

const STORE_CONFIG = {
      name: 'RdbTest.db', // 数据库文件名
      securityLevel: relationalStore.SecurityLevel.S1 // 数据库安全级别
    };

    relationalStore.getRdbStore(this.context, STORE_CONFIG, (err, store) => {
      if (err) {
        console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
        return;
      }
      console.info(`Succeeded in getting RdbStore.`);
      //保存store, 方便后面我们对数据库的操作
      RdbUtils.setStore(store)

    });

4. 创建数据库表

通过relationalStore.getRdbStore获得RdbStore(store)对象后 , 将其保存到我们的工具包中的静态变量中,方便我们后面执行创建数据库的操作。

在我们的工具包代码RdbUtils.ts文件中,添加 executeSql方法:

import relationalStore from '@ohos.data.relationalStore';
export default class RdbUtils {
  ...
  static executeSql(sql: string): Promise<void> {
    return RdbUtils.getStore().executeSql(sql);
  }
  ...
}

RdbStore.executeSql接口说明:

executeSql(sql: string, bindArgs?: Array<ValueType>):Promise<void>

执行包含指定参数但不返回值的SQL语句,使用Promise异步回调。

参数:

参数名

类型

必填

说明

sql

string

指定要执行的SQL语句。

bindArgs

Array<ValueType>

SQL语句中参数的值。当sql参数语句完整时,该参数不填。

在我们UI页面index.ets

import RdbUtils from '../common/rdbUtils/RdbUtils';
@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        Button('创建数据库表')
          .onClick(() => {
            const SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS EMPLOYEE (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER, SALARY REAL, CODES BLOB)'; // 建表Sql语句
            RdbUtils.executeSql(SQL_CREATE_TABLE)
            .then(() =>{
                openDialog('successfully created table')
              }).catch((err) => {
              openDialog(err);
            })
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

function openDialog(text: string) {
  AlertDialog.show(
    {
      title: 'title',
      message: text,
      autoCancel: true,
      alignment: DialogAlignment.Bottom,
      offset: { dx: 0, dy: -20 },
    }
  )
}

这个代码中,我们绑定了一个按钮,用来点击执行创建数据库表的操作。当执行RdbUtils.executeSql时,将返回Promise对象,将其处理之后。通过弹窗的形式将其展示。

效果如下:

Harmony鸿蒙应用开发——关系型数据库(RelationalStore),数据库,harmonyos,oracle

表结构说明:

这是一个SQL语句,用于在数据库中创建一个名为"EMPLOYEE"的表。以下是该表的结构说明:

表名: EMPLOYEE

列名及类型:

  1. ID: 这是一个整数类型的列,被设置为主键,并且自动递增。这意味着每次添加新记录时,此列的值会自动增加,不允许重复。
  2. NAME: 这是一个文本类型的列,不允许为空。这意味着在插入或更新记录时,必须为这一列提供值。
  3. AGE: 这是一个整数类型的列,可以包含任何整数值。
  4. SALARY: 这是一个浮点数类型的列,可以用于存储工资或薪水的值。
  5. CODES: 这是一个BLOB类型的列,通常用于存储二进制数据。它可以用于存储代码、数据或其他二进制格式的信息。

约束:

  • 由于"ID"列被指定为主键,所以每个"ID"值必须是唯一的,并且不能为空。
  • "NAME"列被设置为"NOT NULL",这意味着每次插入或更新记录时,必须为这一列提供值。

5. 插入数据

在插入数据之前,需要再工具包中添加insert()方法:

import relationalStore from '@ohos.data.relationalStore';
export default class RdbUtils {
  ...
  static insert(tableName: string, data: any): Promise<number> {
    return RdbUtils.getStore().insert(tableName, data);
  }
  ...
}

接口说明

insert:

insert(table: string, values: ValuesBucket):Promise<number>

向目标表中插入一行数据,使用Promise异步回调。

参数:

参数名

类型

必填

说明

table

string

指定的目标表名。

values

ValuesBucket

表示要插入到表中的数据行。

返回值:

类型

说明

Promise<number>

Promise对象。如果操作成功,返回行ID;否则返回-1。

之后,在我们的UI中调用RdbUtils中的insert()方法插入数据。示例代码如下所示:、

import RdbUtils from '../common/rdbUtils/RdbUtils';
@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        ...
        Button('插入数据')
          .onClick(() => {
            const valueBucket = {
              'NAME': 'Lisa',
              'AGE': 18,
              'SALARY': 100.5,
              'CODES': new Uint8Array([1, 2, 3, 4, 5])
            };
            RdbUtils.insert('EMPLOYEE', valueBucket)
              .then((updateNumber) => {
                openDialog('已插入数据:' + updateNumber)
            }).catch((error) => {
              openDialog('error: ' + error)
            })
          })
        ...
      }
      .width('100%')
    }
    .height('100%')
  }
}
...

效果如图所示:

Harmony鸿蒙应用开发——关系型数据库(RelationalStore),数据库,harmonyos,oracle

6. 查询数据

查询数据可以通过RdbStore中的query()方法执行查询,返回ResultSet:

接口说明:

query(predicates: RdbPredicates, columns?: Array<string>):Promise<ResultSet>

根据指定条件查询数据库中的数据,使用Promise异步回调。

参数:
 

参数名

类型

必填

说明

predicates

RdbPredicates

RdbPredicates的实例对象指定的查询条件。

columns

Array<string>

表示要查询的列。如果值为空,则查询应用于所有列。

在我们的工具包中添加代码:

static queryAll(): Promise<Array<Employee>> {
    let predicates = new relationalStore.RdbPredicates('EMPLOYEE');
    return new Promise<Array<Employee>>((resolve, reject) => {
      RdbUtils.getStore().query(predicates).then((result) => {
        let employees = new Array<Employee>();
        while (result.goToNextRow()) {
          let employee = new Employee(
            result.getLong(0),
            result.getString(1),
            result.getLong(2),
            result.getDouble(3),
            result.getBlob(4)
          );
          employees.push(employee);
        }
        resolve(employees);
      }).catch((error) => {
        reject(error)
      })
    })
  }

该方法将通过RdbUtils.getStore().query(predicates)获取的结果集封装到Employee类中,然后通过Promise进行返回。

实体类Employee:

export default class Employee {
  id: number; // 员工ID
  name: string; // 姓名
  age: number | null; // 年龄,允许为null
  salary: number | null; // 工资,允许为null
  codes: Uint8Array | null; // 二进制数据,用于存储 BLOB 类型,允许为null

  constructor(id: number, name: string, age: number | null, salary: number | null, codes: Uint8Array | null) {
    this.id = id;
    this.name = name;
    this.age = age;
    this.salary = salary;
    this.codes = codes;
  }
}

在UI方面代码如下:

import RdbUtils from '../common/rdbUtils/RdbUtils';
@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        ...
        Button('查询数据')
          .onClick(() => {
            RdbUtils.queryAll()
              .then((employees: Array<Employee>) => {
                openDialog('employees: ' + JSON.stringify(employees))
              }).catch((error) => {
              openDialog('error' + error.toString())
            })
          })
        ...
      }
      .width('100%')
    }
    .height('100%')
  }
}
...

效果图:

Harmony鸿蒙应用开发——关系型数据库(RelationalStore),数据库,harmonyos,oracle

7. 修改和删除数据

接口说明:

update

update(values: ValuesBucket, predicates: RdbPredicates):Promise<number>

根据RdbPredicates的指定实例对象更新数据库中的数据,使用Promise异步回调。

参数:

参数名

类型

必填

说明

values

ValuesBucket

values指示数据库中要更新的数据行。键值对与数据库表的列名相关联。

predicates

RdbPredicates

RdbPredicates的实例对象指定的更新条件。

在工具包中添加:

...
  static deleteById(id: number) {
    let predicates = new relationalStore.RdbPredicates('EMPLOYEE');
    predicates.equalTo('ID', id)
    return RdbUtils.getStore().delete(predicates);
  }

  static updateById(id: number, data: any) {
    let predicates = new relationalStore.RdbPredicates('EMPLOYEE');
    predicates.equalTo('ID', id)
    return RdbUtils.getStore().update(data, predicates);
  }
...

这两个方法,一个是通过id删除数据,另一个是通过id修改数据

在UI层面:

      	Button('修改数据')
          .onClick(() => {
            const valueBucket = {
              'NAME': 'Rose',
              'AGE': 999,
              'SALARY': 100.5,
              'CODES': new Uint8Array([1, 2, 3, 4, 5])
            };
            RdbUtils.updateById(1, valueBucket)
              .then((updateNumber) => {
                openDialog('已更新数据:' + updateNumber.toString())
              }).catch((err) => {
              openDialog(err)
            })
          })

        Button('删除数据')
          .onClick(() => {
            RdbUtils.deleteById(1)
              .then((updateNumber) => {
                openDialog('已删除数据:' + updateNumber.toString())
              }).catch((err) => {
              openDialog(err)
            })
          })

Harmony鸿蒙应用开发——关系型数据库(RelationalStore),数据库,harmonyos,oracle

Harmony鸿蒙应用开发——关系型数据库(RelationalStore),数据库,harmonyos,oracle

Harmony鸿蒙应用开发——关系型数据库(RelationalStore),数据库,harmonyos,oracle

Harmony鸿蒙应用开发——关系型数据库(RelationalStore),数据库,harmonyos,oracle

8. 删除数据库

调用deleteRdbStore()方法,删除数据库及数据库相关文件。示例代码如下:
 

export default class EntryAbility extends UIAbility {
  ...
  onDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
    relationalStore.deleteRdbStore(this.context, 'RdbTest.db', (err) => {
      if (err) {
        console.error(`Failed to delete RdbStore. Code:${err.code}, message:${err.message}`);
        return;
      }
      console.info('Succeeded in deleting RdbStore.');
    });
  }
  ....
}

这里我在EntryAbility中的onDestroy生命周期函数中调用了删除数据库的操作,这意味着当我们的Ability被销毁的时候,自动将数据库删除。

接口说明:

relationalStore.deleteRdbStore

deleteRdbStore(context: Context, name: string, callback: AsyncCallback<void>): void

删除数据库,使用callback异步回调。

参数:

参数名

类型

必填

说明

context

Context

应用的上下文。

FA模型的应用Context定义见Context。

Stage模型的应用Context定义见Context。

name

string

数据库名称。

callback

AsyncCallback<void>

指定callback回调函数文章来源地址https://www.toymoban.com/news/detail-793160.html

到了这里,关于Harmony鸿蒙应用开发——关系型数据库(RelationalStore)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:安全区域)

    安全区域是指页面的显示区域,默认不与系统设置的非安全区域比如状态栏、导航栏区域重叠,默认情况下开发者开发的界面都被布局在安全区域内。提供属性方法允许开发者设置组件绘制内容突破安全区域的限制,通过expandSafeArea属性支持组件不改变布局情况下扩展其绘制

    2024年04月29日
    浏览(41)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:边框设置)

    设置组件边框样式。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 border(value: BorderOptions) 设置边框样式。 卡片能力:  从API version 9开始,该接口支持在ArkTS卡片中使用。 系统能力:  SystemCapability.ArkUI.ArkUI.Full 参数: 参数

    2024年04月23日
    浏览(53)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Checkbox)

    提供多选框组件,通常用于某选项的打开或关闭。 说明: API version 11开始,Checkbox默认样式由圆角方形变为圆形。 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 无 Checkbox(options?: CheckboxOptions) 多选框组件。 卡片能力:  从

    2024年04月11日
    浏览(50)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:CalendarPicker)

    日历选择器组件,提供下拉日历弹窗,可以让用户选择日期。 说明: 该组件从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 无 CalendarPicker(options?: CalendarOptions) 日历选择器。 系统能力:  SystemCapability.ArkUI.ArkUI.Full 参数: 参数名

    2024年03月09日
    浏览(43)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(自定义事件分发)

    ArkUI在处理触屏事件时,会在触屏事件触发前进行按压点和组件区域的触摸测试,来收集需要响应触屏事件的组件,再基于触摸测试结果分发相应的触屏事件。在父节点,开发者可以通过onChildTouchTest决定如何让子节点去做触摸测试,影响子组件的触摸测试,最终影响后续的触

    2024年04月14日
    浏览(56)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:ImageAnimator)

    提供帧动画组件来实现逐帧播放图片的能力,可以配置需要播放的图片列表,每张图片可以配置时长。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 无 ImageAnimator() 从API version 10开始,该接口支持在ArkTS卡片中使用。

    2024年03月15日
    浏览(50)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Flex)

    以弹性方式布局子组件的容器组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 Flex组件在渲染时存在二次布局过程,因此在对性能有严格要求的场景下建议使用Column、Row代替。 Flex组件主轴默认不设置时撑满父容

    2024年04月11日
    浏览(50)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:组件标识)

    id为组件的唯一标识,在整个应用内唯一。本模块提供组件标识相关接口,可以获取指定id组件的属性,也提供向指定id组件发送事件的功能。 说明: 从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 名称 参数说明 描述 id string 组件

    2024年04月22日
    浏览(65)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:List)

    列表包含一系列相同宽度的列表项。适合连续、多行呈现同类数据,例如图片和文本。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 该组件内容区小于一屏时,默认没有回弹效果。需要回弹效果,可以通过edgeEffe

    2024年04月13日
    浏览(105)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:尺寸设置)

    用于设置组件的宽高、边距。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 width(value: Length) 设置组件自身的宽度,缺省时使用元素自身内容需要的宽度。若子组件的宽大于父组件的宽,则会画出父组件的范围。 从API ver

    2024年03月15日
    浏览(85)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包