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

程序员一鸣
• 阅读 1

前言

代码案例基于Api12

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

本篇的内容大致如下:

1、远程地址依赖

2、数据库创建和表创建

3、数据库增删改查

4、使用总结

一、远程地址依赖

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

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

OpenHarmony三方库中心仓地址:

https://ohpm.openharmony.cn/#/cn/detail/@abner%2Fdatastore

二、数据库创建和表创建

1、数据库创建

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

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语句执行

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

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

属性 类型 概述
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异步回调,亦或者同步执行,大家在使用的过程中,可以根据自身业务需要进行选择性调用,也分别暴露了成功和失败的方法,可以针对性的判断在执行的过程中是否执行成功。

如下案例:

DbUtil.getInstance().delete(deleteRdbPredicates,
          (rows: number)=>{
            //成功
          },
          (err: BusinessError)=>{
            //失败
        })
点赞
收藏
评论区
推荐文章
Elasticsearch Head插件使用小结
ElasticSearchhead就是一款能连接ElasticSearch搜索引擎,并提供可视化的操作页面对ElasticSearch搜索引擎进行各种设置和数据检索功能的管理插件,如在head插件页面编写RESTful接口风格的请求,就可以对ElasticSearch中的数据进行增删改查、创建或者删除索引等操作。类似于使用navicat工具连接MySQL这种关系型数据库,对数据库做操作
顺心 顺心
4年前
Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析
Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析前言SQLite数据库操作在Android开发中非常常用今天我将带大家全面了解关于SQLite数据库的操作(增、删、查、改)image(https:/
Kelly916 Kelly916
4年前
Android 打造属于自己的数据库操作类。
1、概述开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建、管理数据库。但是当我们需要去做增删改查的操作的时候,就得通过get
Wesley13 Wesley13
3年前
MongoDB 教程(一):了解 NoSQL
概述:  MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。  MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。关系型数据库遵循ACID规则  事务在英文中是tran
Wesley13 Wesley13
3年前
mySQL (关系型数据库管理系统)
MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件。MySQL是一种关系数据库管理系统,关
Wesley13 Wesley13
3年前
mysql面试题及答案
01\.列举常见的关系型数据库和非关系型都有那些?1.关系型数据库通过外键关联来建立表与表之间的关系,常见的有:SQLite、Oracle、mysql2.非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定常见的有:MongoDb、redis02\.MySQL常见数据库引擎
Stella981 Stella981
3年前
Redis数据库基础操作
MySQL和Redis的区别"""redis:内存数据库(读写快,IO操作少)、非关系型(操作数据方便)mysql:硬盘数据库(数据持久化,IO操作多)、关系型(操作数据间关系)大量访问的临时数据,才有redis数据库更优"""redis和memca
Wesley13 Wesley13
3年前
mysql零基础入门视频教程免费分享!
MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件。目前mysql已经成为最为流行的开源关
Wesley13 Wesley13
3年前
MongoDB基础
MongoDB与关系型数据库的对比:!(https://oscimg.oschina.net/oscnet/545b6624046cd348c3b292bc4b161d0a272.png) 1.创建数据库: 2.创建集合3.集合的增、删、改、查1)在集合(表名)中插入一个文档(一行数据):db.集合名称.insert({name
Stella981 Stella981
3年前
Android中个人推崇的数据库使用方式
手机应用开发中经常会使用到数据库存储一些资料或者进行数据缓存,android中为我们提供了一个轻量的数据库,在上层进行了一层封装,同时还为我们提供了ContentProvider的框架,方便我们进行数据操作,以及在不同的程序之间进行数据共享。本文介绍一下,我在使用数据库的一些我认为比较好的习惯,欢迎与我讨论。关于框架通常网络操作,Json解析