HarmonyOS学习(十三)——数据管理(二) 关系型数据库

文章目录

官方文档地址: 通过关系型数据库实现数据持久化-应用数据持久化-ArkData(方舟数据管理)-应用框架 - 华为HarmonyOS开发者 (huawei.com)

1、基本概念
  • 关系数据库:用于关系模型来管理数据的数据库,以行和列的形式存储数据。
  • 谓词:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
  • 结果集:指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便地拿到用户想要的数据。
  • Sqlite:一款用于嵌入式的轻量型关系数据库。
2、运行机制

关系型数据库对外提供通用的操作接口,底层使用Sqlite作为持久化存储引擎,支持Sqlite具有的所有数据库特征,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。

3、默认配置与限制
  1. 系统默认日志方式是WAL(Write Ahead Log)模式,系统默认落盘方式是FULL模式。
  2. 数据库使用的共享内存默认大小为2M。
  3. 数据库中连接池最大数量是4个,用以管理用户的读操作。
  4. 为保证数据的准确性,数据库同一时间只能支持一个写操作。
  5. 当应用被卸载完成后,设备上的相关数据库文件及临时文件会被自动清除。
  6. ArkTS侧支持的基本数据类型:number、string、二进制类型数据、boolean。
4、接口说明

以下是关系型数据库持久化功能的相关接口,大部分为异步接口。异步接口均有callback和Promise两种返回形式,下表均以callback形式为例,更多接口及使用方式请见关系型数据库

接口名称 描述
getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback): void 获得一个RdbStore,操作关系型数据库,用户可以根据自己的需求配置RdbStore的参数,然后通过RdbStore调用相关接口可以执行相关的数据操作。
executeSql(sql: string, bindArgs: Array, callback: AsyncCallback):void 执行包含指定参数但不返回值的SQL语句。
insert(table: string, values: ValuesBucket, callback: AsyncCallback):void 向目标表中插入一行数据。
update(values: ValuesBucket, predicates: RdbPredicates, callback: AsyncCallback):void 根据predicates的指定实例对象更新数据库中的数据。
delete(predicates: RdbPredicates, callback: AsyncCallback):void 根据predicates的指定实例对象从数据库中删除数据。
query(predicates: RdbPredicates, columns: Array, callback: AsyncCallback):void 根据指定条件查询数据库中的数据。
deleteRdbStore(context: Context, name: string, callback: AsyncCallback): void 删除数据库。
5、实战:开发"账本"
5.1、创建RdbStore
plain 复制代码
import relationalStore from '@ohos.data.relationalStore';

 private rdbStore:relationalStore.RdbStore = null;

  private ACCOUNT_TABLE = {
    tableName: "accountTable",
    sqlCreate: "CREATE TABLE IF NOT EXISTS accountTable (" +
    "id INTEGER PRIMARY KEY AUTOINCREMENT," +
    "accountType INTEGER," +
    "typeText TEXT," +
    "amount INTEGER)",
    columns: ['id', 'accountType', 'typeText', 'amount']
  };

  private STORE_CONFIG: relationalStore.StoreConfig = {
    name: "rdbstore.db", //数据库文件名
    securityLevel: relationalStore.SecurityLevel.S1, //数据库安全等级
    encrypt: false, //指定数据库是否加密  默认不加密
  }

  aboutToAppear(){
    //获取一个RdbStore
    relationalStore.getRdbStore(this.context,this.STORE_CONFIG,(err,store) => {
      if(err){
        console.info(this.LOG_TAG,'getRdbStore failed,err:'+err);
        return;
      }
      console.info(this.LOG_TAG,'getRdbStore success');
      this.rdbStore = store;
      store.executeSql(this.ACCOUNT_TABLE.sqlCreate);
    });
  }
5.2、创建数据库
plain 复制代码
//创建表
Button("创建表")
  .width('100%')
  .type(ButtonType.Capsule)
  .onClick(() => {
     this.rdbStore.executeSql(this.ACCOUNT_TABLE.sqlCreate);
  })
5.3、增加数据
plain 复制代码
//添加数据
Button("ADD")
  .width('100%')
  .type(ButtonType.Capsule)
  .margin({top:20})
  .onClick(() => {
   let valueBucket1:relationalStore.ValuesBucket = {
     'accountType':0,
     'typeText':'购物',
     'amount':20
   };
    this.rdbStore.insert(this.ACCOUNT_TABLE.tableName,valueBucket1,(err,rowId) => {
      if(err){
        console.info(this.LOG_TAG,'insertData() failed,err : '+ err);
        return;
      }else {
        console.info(this.LOG_TAG,'Succesed in insert data , rowId:'+rowId);
      }
    })
  })
5.4、删除数据
plain 复制代码
//删除数据
Button("Delete")
  .width('100%')
  .type(ButtonType.Capsule)
  .margin({ top: 20 })
  .onClick(() => {
    let predicate: relationalStore.RdbPredicates = new relationalStore.RdbPredicates(this.ACCOUNT_TABLE.tableName);
    predicate.equalTo('id', 1); //删除id为1的数据
    this.rdbStore.delete(predicate, (err, rows) => {
      if(err){
        console.info(this.LOG_TAG,'deleteData() failed,err: ' + err);
        return;
      } else {
        console.info(this.LOG_TAG,'delete rows:'+rows)
      }
    })
  });
5.5、修改数据
plain 复制代码
 //修改数据
      Button("Update")
        .width('100%')
        .type(ButtonType.Capsule)
        .margin({ top: 20 })
        .onClick(() => {
          let valueBucket: relationalStore.ValuesBucket = {
            'accountType': 0,
            'typeText': '购物',
            'amount': 50
          };
          let predicate: relationalStore.RdbPredicates = new relationalStore.RdbPredicates(this.ACCOUNT_TABLE.tableName);
          predicate.equalTo('typeText', '购物'); //修改购物的值
          this.rdbStore.update(valueBucket,predicate, (err, rows) => {
            if(err){
              console.info(this.LOG_TAG,'update() failed,err: ' + err);
              return;
            } else {
              console.info(this.LOG_TAG,'success update rows count:'+rows);
            }
          })
        });
5.6、查询数据
plain 复制代码
//查询数据
Button("Query")
  .width('100%')
  .type(ButtonType.Capsule)
  .margin({ top: 20 })
  .onClick(() => {
    let predicate: relationalStore.RdbPredicates = new relationalStore.RdbPredicates(this.ACCOUNT_TABLE.tableName);
    predicate.equalTo('typeText', '购物'); //修改购物的值
    let result:Array<AccountData> = [];
    this.rdbStore.query(predicate,['id','accountType','typeText','amount'],(err,resultSet) => {
      if(err){
        console.info(this.LOG_TAG,'query() failed,err: ' + err);
        return;
      }else {
        console.info(this.LOG_TAG,'resultSet column name:'+ resultSet.columnNames+'column count:'=resultSet.columnCount);
        while (resultSet.goToNextRow()){
          let temp:AccountData = {id:0,accountType:0,typeText:'',amount:0}
          temp.id = resultSet.getDouble(resultSet.getColumnIndex('id'));
          temp.accountType = resultSet.getDouble(resultSet.getColumnIndex('accountType'));
          temp.typeText = resultSet.getString(resultSet.getColumnIndex('typeText'));
          temp.amount = resultSet.getDouble(resultSet.getColumnIndex('amount'));
          result.push(temp);
        }
        resultSet.close();//释放数据集内存

      }
    })
  });
5.7、备份数据库
plain 复制代码
this.rdbStore.backup(this.STORE_CONFIG.name,(err) => {
  if(err){
    console.info(this.LOG_TAG,'failed backup err;'+err);
    return;
  } else {
    console.info(this.LOG_TAG,'backup  success')
  } 
});
5.8、恢复数据库
plain 复制代码
this.rdbStore.restore(this.STORE_CONFIG.name,(err) => {
  if(err){
    console.info(this.LOG_TAG,'failed restore err;'+err);
    return;
  } else {
    console.info(this.LOG_TAG,'restore  success')
  } 
});
5.9、删除数据库
plain 复制代码
this.rdbStore.deleteRdbStore(this.context,this.STORE_CONFIG.name,(err) => {
  if(err){
    console.info(this.LOG_TAG,'failed delete err;'+err);
    return;
  } else {
    console.info(this.LOG_TAG,'delete  success')
  } 
});
相关推荐
sanguine__10 分钟前
Web APIs学习 (操作DOM BOM)
学习
独行soc28 分钟前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain1 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship1 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站1 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶1 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
AORO_BEIDOU2 小时前
单北斗+鸿蒙系统+国产芯片,遨游防爆手机自主可控“三保险”
华为·智能手机·harmonyos
数据的世界012 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐3 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
梦想平凡3 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle