概述
这里是我的项目地址,欢迎大家下载参考~有问题欢迎互相指出,谢谢!!
项目gitee地址
丑化说在前头,这个备忘录真的是十分简陋,这一篇的写作目的不是为了能告诉读者备忘录怎么写和怎么美化,而是希望在现有鸿蒙OS4关系型数据库教学还比较少的情况下,官网教学也比较简陋,把复杂的数据库设置抽离出来,让大家少走点弯路,让大家能更快的利用关系型数据库实现自己想要的业务目标。
笔者走了很多弯路了呜呜,希望大家多多点赞收藏~~
废话不多说,开干!!
这个学习案例,主要是参考b站大佬的备忘录设计和华为开发者官网的例子记账本,大家也可以在了解基本关系型数据库怎么设置后具体学习
我们主要/scr/main的目录结构如下:
../scr/main目录下文件树结构展示
.
|-- constants
| `-- CommonConstants.ets
|-- database
| |-- MemoTable.ets
| `-- Rdb.ets
|-- ets
| |-- component
| | `-- MemoItem.ets
| |-- entryability
| | `-- EntryAbility.ts
| `-- pages
| `-- Index.ets
|-- model
| |-- MemoModel.ets
| `-- TableInterface.ets
|-- module.json5
|-- resources
| |-- base
| | |-- element
| | | |-- color.json
| | | `-- string.json
| | |-- media
| | | `-- icon.png
| | `-- profile
| | `-- main_pages.json
| |-- en_US
| | `-- element
| | `-- string.json
| |-- rawfile
| `-- zh_CN
| `-- element
| `-- string.json
`-- utils
`-- Logger.ets
数据库的配置
我们先配置数据库
在./main/constants
目录下,创建CommonConstants.ets
文件,在这个文件里,我们存放Rdb数据库的基本配置,具体跟官网样例也差不多
import relationalStore from '@ohos.data.relationalStore'
import {
MemoTable } from '../model/TableInterface'
export default class CommonConstants {
// Rdb 数据库配置
static readonly STORE_CONFIG:relationalStore.StoreConfig = {
name:'database.db',
securityLevel:relationalStore.SecurityLevel.S1
}
static readonly MEMO_TABLE:MemoTable = {
tableName:'memoTable',
sqlCreate:'CREATE TABLE IF NOT EXISTS memoTable(id INTEGER PRIMARY KEY AUTOINCREMENT, updateTime INTEGER, content TEXT)',
columns:['id','updateTime','content']
}
// 一些日志控制参数
static readonly RDB_TAG = '[Debug.Rdb]';
static readonly TABLE_TAG = '[Debug.memoTable]';
static readonly INDEX_TAG = '[Debug.Index]';
}
我在学习的时候注意到,大佬在/main/model
目录下,设置了TableInterface.ets
文件,存放了一个MeMoTable
接口
这种接口的设置,不用设置关键词function
,我认识到可能一个是为了给CommonConstants
类中的MEMO_TABLE
内部元素设置类型,一个是降低代码耦合度便于后面维护
在/main/model
目录下,新建TableInterface.ets
文件,写一个MeMoTable
接口
```typescript
export interface MemoTable {
tableName: string
sqlCreate: string
columns: string[]
}
本来的定义如下
interface 接口名{
接口代码:一般定义规则、方法等
方法名(形参:形参类型):方法返回值
}
进一步,大佬对数据库的操作进行了一层抽象,这个抽象的意思就是把很复杂的操作用几个函数给你概括起来了
就像我们如果形容一辆车,我们本来按照比较机械的方法,要定义外壳轮廓、动力参数什么的,现在直接告诉你小轿车、发动机V8什么的,你就大概了解了,我想后者就是抽象,把复杂的东西简单化
在/main/database
目录下,新建Rdb.ets
文件,这个文件就是负责抽象复杂的数据库操作方法,不用来实现具体业务,只规定获取rdbStore
对象,并用哪张表增删改查之类的流程
我们后续要使用数据库的数据操作时,数据操作也被简化为getRdbStore
, insertData
, deleteData
, updateData
, query
方法
import relationalStore from '@ohos.data.relationalStore';
import CommonConstants from '../constants/CommonConstants';
import Logger from '../utils/Logger';
// 抽象的Rdb类,没有业务属性,可以基于这个类创建带有业务属性的一张或多张表
export default class Rdb {
// 管理关系数据库(RDB)方法属性 类型是RdbStore 或 null
private rdbStore: relationalStore.RdbStore | null = null;
// 数据库表名称
private tableName: string;
// 创建SQLite表的语句字符串
private sqlCreateTable: string;
// 列名字段的数组
private columns: Array<string>;
// 实例化 Rdb 对象时,初始化表名、创建表的语句、列名字段的数组
constructor(tableName: string, sqlCreateTable: string, columns: Array<string>) {
this.tableName = tableName;
this.sqlCreateTable = sqlCreateTable;
this.columns = columns;
}
// 获取操作数据库RdbStore对象的方法,接收一个回调函数
getRdbStore(callback: Function = () => {
}) {
// 如果 回调函数为空、或undefined 打印错误日志,退出方法
if (!callback || typeof callback === 'undefined' || callback === undefined) {
Logger.info(CommonConstants.RDB_TAG, 'getRdbStore() has no callback!');
return;
}
// 如果属性rdbStore 不为空,说明操作对象已经初始化,打印日志,执行回调函数,退出方法
if (this.rdbStore !== null) {
Logger.