上文 HarmonyOS 数据持久化之首选项 preferences 我们有说用户首选项
 但它只能处理一些比较简单的数据类型结构 的持久化处理
 如果是一些批量较大 结构较为复杂的数据结构 那么 首选项就无法满足了 我们就要选择 关系型数据库
通过 SQLite 组件实现的一种本地数据库,具备所有关系型数据库特性 例如(事务 存储过程 视图)等等
 因为是本地型数据库 所以不需要网络 性能也非常强大
因为 harmonyOS 关系型数据库 内容 比较复杂 我们分成三个部分
1 初始化数据库
 2 对数据库进行 增删改 操作
 3 查询操作
那么 我们就先来说 初始化数据库的内容
首先 这个东西 我们要封装起来 成一个类
 在模块下的 ets目录 下 创建一个 utils 目录
 下面创建一个 relationalClass.ts文件
 
 然后 我们类基本骨架写成这样
//创建类对象 名称叫 relationalClass
class relationalClass{
  initTaskDB(context) {
  }
}
//new 一个relationalClass类的实力对象
const relational = new relationalClass()
//将实力对象导出
export default relational as relationalClass
然后 我们初始化的逻辑 就要写在 initTaskDB 中 因为初始化 需要UIAbility 中的 上下文 ConText
 所以 这里 我们先接这个参数
首先 我们要导包
import relationalStore from "@ohos.data.relationalStore";
这也是 harmonyos 内置的 不需要安装 直接导入就可以用
然后 是做一个 rdb配置
const config = {
	name:'MyApplication.db',
	securityLevel: relationalStore.SecurityLevel.S1
}

 这里 对象中 nameo 是我们数据库本地文件名 因为这个相当于是本地文件读写
 然偶 securityLevel 字段就是 relationalStore.SecurityLevel 下的 S1 到 S4 值越大 安全级别越高
 因为 这里 我们就是做个练习 所以 S1就够用了
键表的话 就用 sql 语句就好了 如果不懂sql 可以参考我的文章
 MySQL新建表 演示单表增删查改
const sql = `CREATE TABLE IF NOT EXISTS TASK(
           ID INTEGER PRIMARY KEY AUTOINCREMENT,
           NAME TEXT NOT NULL,
           FINISHED bit`
这里 语句发生了 一点点变化
CREATE TABLE IF NOT EXISTS 表名 这句是基本一样的
 第一 字段 ID
 NTEGER 数字类型
 PRIMARY KEY 设置组件唯一记录 不能重复
 AUTOINCREMENT 数字属性自增 sql中是 AUTO_INCREMENT 这里 不要中间的横杠了
NAME 字段
 这里字符串 变成了 TEXT 文本类型
 NOT NULL 非空约束
FINISHED 字段
TASK 表 三个字段
有一些不太一样 但大体还是看得懂的
我们 整体代码 编写如下
//导入 relationalStore 首选项操作对象 这个包是harmonyos自带的 无需安装
import relationalStore from "@ohos.data.relationalStore";
//创建类对象 名称叫 relationalClass
class relationalClass{
  //记录 rdbStore 操作数据库对象
  private rdbStore:relationalStore.RdbStore
  initTaskDB(context) {
    // 1.rdb配置
    const config = {
      name:'MyApplication.db',
      securityLevel: relationalStore.SecurityLevel.S1
    }
    // 2.初始化sql语句
    const sql = `CREATE TABLE IF NOT EXISTS TASK(
           ID INTEGER PRIMARY KEY AUTOINCREMENT,
           NAME TEXT NOT NULL,
          FINISHED bit`
    // 获取 RDB
    relationalStore.getRdbStore(context, config,(err, rdbStore)=> {
      if(err) {
        console.log('testTag', "获取rdbstore失败!");
        return
      }
      //执行创建表sql
      rdbStore.executeSql(sql);
      console.log('testTag', "创建表sql执行完毕!");
      //记录 rdbStare
      this.rdbStore = rdbStore;
    })
  }
}
//new 一个relationalClass类的实力对象
const relational = new relationalClass()
//将实力对象导出
export default relational as relationalClass
我们定义了一个成员变量 rdbStore
 用于接受 getRdbStore 返回的 rdbStore对象 因为你之后要操作数据库 是需要通过它执行的
然后 我们 initTaskDB中 上来声明了 config 和 sql 内容 这个我们上面讲过
 relationalStore.getRdbStore 获取 rdbSore 需要两个参数 UIAbility上下文的 ConText 和 我们上面声明的config
 这里 会返回两个参数 如果 err有内容 说明 获取失败了 我们直接输出日志
 如果 没有
 则 通过 rdbStore.executeSql 执行我们的sql 需要一个sql字符串做参数
成功后 记录 rdbStore
然后 这里 我们找到模块入口文件
 导入 我们写的这个类 然后在onCreate 生命周期中 使用我们写的 initTaskDB
 传入 我们 UIAbility 上下文的 ConText
 






![BUUCTF---[MRCTF2020]你传你呢1](https://img-blog.csdnimg.cn/direct/58d14ccf39814c3e809351c35fb2c942.png)












