HarmonyOs开发:关系型数据库封装之增删改查

前言

数据量较少的持久化存储,我们可以选择用户首选项或者是分布式键值数据库进行操作,如果前两种无法满足,在鸿蒙当中,也给我们提供了关系型数据库进行数据之间的操作,和Android中类似,关系型数据库基于SQLite组件,提供了一套完整的对本地数据库进行管理的机制,也对外提供一系列的增、删、改、查等接口,非常的方便,为了针对数据更加方便的操作,目前对系统的Api做了一层简单的封装。

本篇的内容大致如下:

1、远程地址依赖

2、数据库创建和表创建

3、数据库增删改查

4、使用总结

一、远程地址依赖

在工程模块的oh-package.json5中设置三方包依赖,配置示例如下:

TypeScript 复制代码
"dependencies": { "@abner/datastore": "^1.0.0"}

OpenHarmony三方库中心仓地址:

ohpm.openharmony.cn/#/cn/detail...

二、数据库创建和表创建

1、数据库创建

数据库创建,在初始化的时候,会默认创建,在AbilityStage里初始化即可。

TypeScript 复制代码
DbUtil.getInstance().init(this.context)

属性介绍

属性 类型 概述
context Context 上下文
storeConfig relationalStore.StoreConfig 数据库相关配置,可默认不传,会创建一个默认的abner_data.db数据库,securityLevel为S3,encrypt为true。

storeConfig

属性 类型 概述
name string 数据库文件名,也是数据库唯一标识符。
securityLevel SecurityLevel 设置数据库安全级别。
encrypt boolean 指定数据库是否加密,默认不加密。true:加密。false:非加密。
dataGroupId string 应用组ID,需要向应用市场获取。模型约束: 此属性仅在Stage模型下可用。从API version 10开始,支持此可选参数。指定在此dataGroupId对应的沙箱路径下创建RdbStore实例,当此参数不填时,默认在本应用沙箱目录下创建RdbStore实例。
customDir string 数据库自定义路径。使用约束: 数据库路径大小限制为128字节,如果超过该大小会开库失败,返回错误。
autoCleanDirtyData boolean 指定是否自动清理云端删除后同步到本地的数据,true表示自动清理,false表示手动清理,默认自动清理。

2、数据表创建

数据表的创建有两种方式,一种是sql语句执行,一种是对象形式执行。

sql语句执行

TypeScript 复制代码
DbUtil.getInstance()
          .executeSql("CREATE TABLE table_name(id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(50),age INT)")

对象形式执行【推荐】

对象形式,弱化了sql语句,但本身还是以sql的形式进行创建数据表,只是业务层的操作,没有了sql操作,执行很是简单直观,第一个参数是数据表的名字也就是table_name,第二个参数是一个对象,也就是数据表的字段,每个字段,需要指定其数据类型等必要的参数,比如主键,自增,长度等等。

TypeScript 复制代码
DbUtil.getInstance().createTable("table_name", {
    "id": { type: DbTableFieldType.INTEGER, isPrimaryKey: true, isAutoIncrement: true },
     "name": { type: DbTableFieldType.VARCHAR, length: 120 },
     "age": { type: DbTableFieldType.INT, length: 30 }
})

三、数据库增删改查

1、增

普通存储

需要定义ValuesBucket对象进行传递。

TypeScript 复制代码
const valueBucket1: ValuesBucket = {
          'name': "AbnerMing",
          'age': 18,
        }
DbUtil.getInstance().insert("table_name", valueBucket1)

对象存储

TypeScript 复制代码
 let bean = new DbDataBean()
 bean.name = "AbnerMing"
 bean.age = 18
 DbUtil.getInstance().insertBean("table_name", bean)

2、删

普通删除

需要用RdbPredicates对象进行设置过滤条件,可以直接查看官网Api即可。

TypeScript 复制代码
let deleteRdbPredicates = new relationalStore.RdbPredicates("table_name");
deleteRdbPredicates.equalTo("id", 1);

DbUtil.getInstance().delete(deleteRdbPredicates)

对象删除

和普通删除类似,只不过RdbPredicates对象做了简单封装,需要调用filterRdbPredicates方法进行设置过滤条件。

TypeScript 复制代码
DbUtil.getInstance()
          .filterRdbPredicates({ equalTo: { "id": 2 } })
          .deleteBean("table_name")

3、改

普通修改

TypeScript 复制代码
const valueBucket: ValuesBucket = {
          'name': "ming",
          'age': 28,
        }

let upDataRdbPredicates = new relationalStore.RdbPredicates("table_name");
upDataRdbPredicates.equalTo("id", 1)

DbUtil.getInstance().update(upDataRdbPredicates, valueBucket)

对象修改

filterRdbPredicates方法为过滤条件,也就是你要更改哪一条数据。

TypeScript 复制代码
 let uBean = new DbDataBean()
 uBean.name = "Ming"
 uBean.age = 20
 DbUtil.getInstance()
  .filterRdbPredicates({ equalTo: { "id": 2 } })
  .updateBean("table_name", uBean)

4、查

普通查询

TypeScript 复制代码
let predicates = new relationalStore.RdbPredicates("table_name");

 DbUtil.getInstance().query(predicates, (resultSet: relationalStore.ResultSet) => {
          // resultSet是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始。
          while (resultSet.goToNextRow()) {
            const id = resultSet.getLong(resultSet.getColumnIndex("id"));
            const name = resultSet.getString(resultSet.getColumnIndex("name"));
            const age = resultSet.getLong(resultSet.getColumnIndex("age"));
          }
        })

对象查询

获取全部

TypeScript 复制代码
DbUtil.getInstance()
          .queryAllBean<DbDataBean>("table_name", (data) => {
           
          })

获取单个

TypeScript 复制代码
DbUtil.getInstance()
          .filterRdbPredicates({ equalTo: { "id": 1 } })
          .queryBean<DbDataBean>("table_name", (data) => {
            
          })

5、filterRdbPredicates

在对象操作的增删改查中,这个方法忽视不得,可执行属性如下:

属性 类型 概述
orderByDesc string 配置谓词以匹配数据表的field列中值按降序排序的列。
orderByAsc string 配置谓词以匹配数据表的field列中值按升序排序的列。
limitAs number 设置最大数据记录数的谓词
offsetAs number 配置谓词以指定返回结果的起始位置
equalTo {} 配置谓词以匹配数据表的field列中值为value的字段。
notEqualTo {} 配置谓词以匹配数据表的field列中值不为value的字段
contains {} 配置谓词以匹配数据表的field列中包含value的字段
between {} 配置谓词以匹配数据表的field列中值在给定范围内的字段(包含范围边界),例如:low=high,必须要带等号。

四、使用总结

每个方法都预留了多种调用方式,比如使用callback异步回调或者使用Promise异步回调,亦或者同步执行,大家在使用的过程中,可以根据自身业务需要进行选择性调用,也分别暴露了成功和失败的方法,可以针对性的判断在执行的过程中是否执行成功。

如下案例:

TypeScript 复制代码
DbUtil.getInstance().delete(deleteRdbPredicates,
          (rows: number)=>{
            //成功
          },
          (err: BusinessError)=>{
            //失败
        })
相关推荐
白茶三许3 小时前
【江鸟中原】“策无忧” 决策模型纯血鸿蒙项目开发
华为·harmonyos
2501_937189234 小时前
2025 优化版神马影视 8.8 源码系统|零基础部署
android·源码·开源软件·源代码管理·机顶盒
马剑威(威哥爱编程)4 小时前
【鸿蒙开发案例篇】鸿蒙跨设备实时滤镜同步的完整方案
华为·harmonyos
モンキー・D・小菜鸡儿6 小时前
Android Jetpack Compose 基础控件介绍
android·kotlin·android jetpack·compose
无风之翼6 小时前
android15 休眠唤醒过程中有时候屏幕显示时间一闪而过
android·锁屏
如此风景8 小时前
iOS SwiftUI开发所有修饰符使用详解
ios
mumuWorld8 小时前
KSCrash 实现机制深度分析
ios·源码阅读
方白羽8 小时前
Android全局悬浮拖拽视图
android·app·客户端
AskHarries9 小时前
Google 登录问题排查指南
flutter·ios·app
waeng_luo9 小时前
[鸿蒙2025领航者闯关] HarmonyOS深色模式实现
harmonyos·鸿蒙2025领航者闯关·鸿蒙6实战·开发者年度总结