本次要介绍的数据库是rdb,关系型数据库(@ohos.data.rdb),在OpenHarmonyOS是如何引用的。(参考开源鸿蒙API7-API9)

关系型数据库

关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。

OpenHarmonyOS引入关系型数据库

import data_rdb from '@ohos.data.rdb'

通过导入数据库模块,使用rdb数据库。

关系型数据库的获取删除操作

获得一个相关的RdbStore​:

getRdbStore(context?: Context, config: StoreConfig, version: number): Promise<RdbStore>

删除数据库操作​:

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

关系型数据库中的关键字

RdbPredicates​:该类确定RDB中条件表达式的值是true还是false

constructor​:构造函数。

inDevices/inAllDevices​:同步分布式数据库时连接到组网内的(所有)远程设备。

equalTo、notEqualTo、isNull、isNotNull、between、notBetween、in、notIn​:根据字面意思领会。

beginWrap、endWrap​:向谓词添加左(右)括号。

or、and​:将或(和)条件添加到谓词中。

beginsWith、endsWith​:配置谓词以匹配数据字段为String且值以指定字符串开头(结尾)的字段。

like​:配置谓词以匹配数据字段为String且值类似于指定字符串的字段。

glob​:配置RdbPredicates匹配数据字段为String的指定字段。

greaterThan、lessThan​:配置谓词以匹配数据字段为valueType且value大于(小于)指定值的字段。

greaterThanOrEqualTo、lessThanOrEqualTo​:配置谓词以匹配数据字段为ValueType且value大于或等于(小于或等于)指定值的字段。

orderByAsc、orderByDesc​:配置谓词以匹配其值按升(降)序排序的列。

distinct​:过滤重复只保留一个。

limitAs​:设置最大数据记录数的谓词。

offsetAs​:配置RdbPredicates以指定返回结果的起始位置。

groupBy​:分组查询。

indexedBy​:配置RdbPredicates以指定索引列。通过索引查找,能够获得更快的查找速率。

RdbStore​:提供管理关系数据库(RDB)方法的接口。

insert、update、delete、query​:插入、更新、删除、查找

querySql<sup>8+</sup>​:根据指定SQL语句查询数据库中的数据,结果以callback形式返回。

executeSql​:执行包含指定参数但不返回值的SQL语句,结果以callbck形式返回(或者以Promise形式返回)。

beginTransaction<sup>8+</sup>​:在开始执行SQL语句之前,开始事务。

commit<sup>8+</sup>​:提交已执行的SQL语句。

setDistributedTables​:设置分布式列表,结果以callbck形式返回(或者以Promise形式返回)。

obtainDistributedTableName​:根据本地表名获取指定远程设备的分布式表名。在查询远程设备数据库时,需要使用分布式表名, 结果以callbck形式返回(或者结果以Promise形式返回)。

sync<sup>8+</sup>​:在设备之间同步数据, 结果以callbck形式返回(或者结果以Promise形式返回)。

on、off​:注册数据库的观察者。当分布式数据库中的数据发生更改时,将调用回调。(删除)

StoreConfig​:管理关系数据库配置。

ValueType​:用于表示允许的数据字段类型。

ValuesBucket​:用于存储键值对。

SyncMode<sup>8+</sup>​:指数据库同步模式。

SubscribeType<sup>8+</sup>​:描述订阅类型。

通过上面的关键字,对OpenHarmonyOS的基础语法有一个基本的认识,对于创建数据库以及,将数据库内嵌到项目中去还需要很多过程。

以applications_notes项目为例,梳理数据库的创建过程。

创建一个数据表,首先需定义数据库的类型,使用的主键,以及个参数列,通过不断地细化进行切分出合理的数据结构。

在applications_notes的开发中,使用的是一个databaseModel包来单独存放这一类型的文件,通过在class中定义数据类型的方式,将每一个数据名称和数据类型一一对应起来。

如下所示


id: number // 主键
title: string // 标题
uuid: string // 唯一标识
folder_uuid: string // 文件夹uuid
content_text: string // 文字内容
content_img: string // 图片路径
note_type: NoteType // 类型
is_top: Top // 是否置顶
is_favorite: Favorite // 是否被收藏
is_deleted: Delete // 是否被删除
created_time: number // 创建时间
modified_time: number // 修改时间
deleted_time: number // 删除时间

创建完实体类型之后还需要进行构造函数。

constructor(id: number, title: string, uuid: string, folder_uuid: string, content_text: string, content_img: string,
note_type: NoteType, is_top: Top, is_favorite: Favorite, is_deleted: Delete, created_time: number,
modified_time: number, deleted_time: number) {
this.id = id
this.title = title
this.uuid = uuid
this.folder_uuid = folder_uuid
this.content_text = content_text
this.content_img = content_img
this.note_type = note_type
this.is_top = is_top
this.is_favorite = is_favorite
this.is_deleted = is_deleted
this.created_time = created_time
this.modified_time = modified_time
this.deleted_time = deleted_time
}

最后一步

/**
* 转化为note_table表的valueBucket
*/
toNoteObject(): any{
return {
"title": this.title,
"uuid": this.uuid,
"folder_uuid": this.folder_uuid,
"content_text": this.content_text,
"content_img": this.content_img,
"note_type": this.note_type,
"is_top": this.is_top,
"is_favorite": this.is_favorite,
"is_deleted": this.is_deleted,
"created_time": this.created_time,
"modified_time": this.modified_time,
"deleted_time": this.deleted_time
}
}

数据库的表结构通过代码的方式已经创建完毕,这只是其中的一个表,对于其他的数据,一样需要这样的操作。

数据库的创建过程application_notes是根据一个数据库操作类来进行创建的,对于数据库,数据表的创建,这样的类放入在baseUtil包中。

createRdbStore(context) {
ohosDataRdb.getRdbStore(context, SysDefData.dbInfo.db_name, SysDefData.dbInfo.db_verison)
.then(async (store) => {
LogUtil.info(TAG, "createRdbStore, store is " + store)
rdbStore = store
// create table
await rdbStore.executeSql(TableSql.FolderTableSQL, null)
await rdbStore.executeSql(TableSql.NoteTableSQL, null)
await rdbStore.executeSql(TableSql.AttachmentTableSQL, null)
await rdbStore.executeSql(TableSql.FormTableSQL, null)
LogUtil.info(TAG, "create table success")
// insert system defined folder
await rdbStore.insert(TableName.FolderTable, SysDefData.sys_def_allNotes)

上面是一部分代码,这里是对数据库,数据表创建的一个归类,通过这种方式从无到有创建。

这个项目除了有封装好数据库的创建以外,还创建了数据库的初始化操作,以及一些对application_notes项目需要用到的其他增删改查做了封装,结构化的代码,更利于代码的可读性和分工。

以上就是我对application_notes代码数据库rdb部分的解读。

以上属于个人理解,不代表任何公司,任何组织的意见。如果你拥有更好的见解,欢迎一起交流探讨。共同交流,共同成长。