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 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
幽蓝计划4 小时前
HarmonyOS NEXT仓颉开发语言实战案例:动态广场
华为·harmonyos
kk爱闹4 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空6 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭6 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日7 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安7 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑7 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
万少10 小时前
第五款 HarmonyOS 上架作品 奇趣故事匣 来了
前端·harmonyos·客户端
幽蓝计划11 小时前
HarmonyOS NEXT仓颉开发语言实战案例:电影App
华为·harmonyos