HarmonyOS NEXT实战开发:数据库封装实现增删改查!

159 篇文章 0 订阅
159 篇文章 1 订阅

前言

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

一、远程地址依赖

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

"dependencies": { "@abner/datastore": "^1.0.0"}

OpenHarmony三方库中心仓地址:

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

二、数据库创建和表创建

1、数据库创建

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

DbUtil.getInstance().init(this.context)
属性介绍
属性类型概述
contextContext上下文
storeConfigrelationalStore.StoreConfig数据库相关配置,可默认不传,会创建一个默认的abner_data.db数据库,securityLevel为S3,encrypt为true。
storeConfig
属性类型概述
namestring数据库文件名,也是数据库唯一标识符。
securityLevelSecurityLevel设置数据库安全级别。
encryptboolean指定数据库是否加密,默认不加密。true:加密。false:非加密。
dataGroupIdstring应用组ID,需要向应用市场获取。模型约束: 此属性仅在Stage模型下可用。从API version 10开始,支持此可选参数。指定在此dataGroupId对应的沙箱路径下创建RdbStore实例,当此参数不填时,默认在本应用沙箱目录下创建RdbStore实例。
customDirstring数据库自定义路径。使用约束: 数据库路径大小限制为128字节,如果超过该大小会开库失败,返回错误。
autoCleanDirtyDataboolean指定是否自动清理云端删除后同步到本地的数据,true表示自动清理,false表示手动清理,默认自动清理。

2、数据表创建

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

sql语句执行
DbUtil.getInstance()
          .executeSql("CREATE TABLE table_name(id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(50),age INT)")
对象形式执行【推荐】

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

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对象进行传递。

const valueBucket1: ValuesBucket = {
          'name': "AbnerMing",
          'age': 18,
        }
DbUtil.getInstance().insert("table_name", valueBucket1)
对象存储
 let bean = new DbDataBean()
 bean.name = "AbnerMing"
 bean.age = 18
 DbUtil.getInstance().insertBean("table_name", bean)

2、删

普通删除

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

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

DbUtil.getInstance().delete(deleteRdbPredicates)
对象删除

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

DbUtil.getInstance()
          .filterRdbPredicates({ equalTo: { "id": 2 } })
          .deleteBean("table_name")

3、改

普通修改
const valueBucket: ValuesBucket = {
          'name': "ming",
          'age': 28,
        }

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

DbUtil.getInstance().update(upDataRdbPredicates, valueBucket)
对象修改

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

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

4、查

普通查询
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"));
          }
        })
对象查询

获取全部

DbUtil.getInstance()
          .queryAllBean<DbDataBean>("table_name", (data) => {
           
          })

获取单个

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

5、filterRdbPredicates

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

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

四、使用总结

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

如下案例:

DbUtil.getInstance().delete(deleteRdbPredicates,
          (rows: number)=>{
            //成功
          },
          (err: BusinessError)=>{
            //失败
        })

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)文档用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:

 →【纯血版鸿蒙全套最新学习文档】希望这一份鸿蒙学习文档能够给大家带来帮助~


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.学习视频+学习PDF文档

HarmonyOS Next 最新全套视频教程 (鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

​​

 纯血版鸿蒙全套学习文档(面试、文档、全套视频等)

                   

​​​​鸿蒙APP开发必备

​​

总结

【纯血版鸿蒙全套最新学习文档】

总的来说,华为鸿蒙不再兼容安卓,对程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,才能在这个变革的时代中立于不败之地。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值