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

news2024/11/13 0:20:48

文章目录

        • 1、基本概念
        • 2、运行机制
        • 3、默认配置与限制
        • 4、接口说明
        • 5、实战:开发“账本”
          • 5.1、创建RdbStore
          • 5.2、创建数据库
          • 5.3、增加数据
          • 5.4、删除数据
          • 5.5、修改数据
          • 5.6、查询数据
          • 5.7、备份数据库
          • 5.8、恢复数据库
          • 5.9、删除数据库

官方文档地址: 通过关系型数据库实现数据持久化-应用数据持久化-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
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、创建数据库
//创建表
Button("创建表")
  .width('100%')
  .type(ButtonType.Capsule)
  .onClick(() => {
     this.rdbStore.executeSql(this.ACCOUNT_TABLE.sqlCreate);
  })
5.3、增加数据
//添加数据
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、删除数据
//删除数据
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、修改数据
 //修改数据
      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、查询数据
//查询数据
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、备份数据库
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、恢复数据库
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、删除数据库
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')
  } 
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

堆的向下调整算法和TOPK问题

目录 1.什么是堆&#xff1f; 1.1 向下调整建堆的时间复杂度计算 1.2 堆的结构体设计 2.堆的功能实现&#xff1a; 2.1 堆的插入&#xff1a; 2.2 堆的删除&#xff1a; 2.3 堆排序&#xff1a; 2.4 向下调整建堆&#xff1a; 2.5 TOPK问题&#xff1a; 2.6 向上调整算…

对接金蝶云星空调用即时库存信息查询API(附JAVA实现)

文章目录 前言准备工作获取第三方授权权限与授权配置信息集成金蝶云SDK调用实现备注前言 对于有自己商品信息管理后台并且使用金蝶ERP系统管理物料的商家来说,将金蝶上物料的库存信息同步到管理后台就可以不用去金蝶上确认库存了,可以大大简化管理后台的库存变更工作,这篇文…

Call OpenAI API with Python requests is missing a model parameter

题意&#xff1a;使用 Python requests 调用 OpenAI API 时缺少 model 参数。 问题背景&#xff1a; Im trying to call OpenAI API from Python. I know they have their own openai package, but I want to use a generic solution. I chose the requests package for its f…

通义千问重磅开源Qwen2.5,性能超越Llama

Qwen2.5 新闻 9月19日云栖大会&#xff0c;阿里云CTO周靖人发布通义千问新一代开源模型Qwen2.5&#xff0c;旗舰模型Qwen2.5-72B性能超越Llama 405B&#xff0c;再登全球开源大模型王座。Qwen2.5全系列涵盖多个尺寸的大语言模型、多模态模型、数学模型和代码模型&#xff0c;每…

TransUNet: 通过Transformer的视角重新思考U-Net架构在医学图像分割中的设计|文献速递-Transformer架构在医学影像分析中的应用

Title 题目 TransUNet: Rethinking the U-Net architecture design for medical imagesegmentation through the lens of transformers TransUNet: 通过Transformer的视角重新思考U-Net架构在医学图像分割中的设计 01 文献速递介绍 卷积神经网络&#xff08;CNNs&#xff…

计算机毕业设计之:教学平台微信小程序(

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

生信初学者教程(四):软件

文章目录 RRstudioLinux系统其他软件本书是使用R语言编写的教程,用户需要下载R和RStudio软件用于进行分析。 版权归生信学习者所有,禁止商业和盗版使用,侵权必究 R R语言是一种免费的统计计算和图形化编程语言,是一种用于数据分析和统计建模的强大工具。它具有丰富的统计…

CSP-CCF★201912-2回收站选址★

一、问题描述 二、解答 代码&#xff1a; #include<iostream> #include<map> using namespace std; struct rubbish{int x;int y; }rub[1000]; int n; void input(){cin>>n;for(int i0;i<n;i){cin>>rub[i].x>>rub[i].y;} } bool has(int p,…

【machine learning-八-可视化loss funciton】

可视化lossfunction loss funciton可视化损失函数等高图 loss funciton 上一节讲过损失函数&#xff0c;也就是代价函数&#xff0c;它是衡量模型训练好坏的指标&#xff0c;对于线性回归来说&#xff0c;模型、参数、损失函数以及目标如下&#xff1a;、 损失函数的目标当然…

什么品牌超声波清洗机质量好?四大绝佳超声波清洗机品牌推荐!

在快节奏的现代生活中&#xff0c;个人物品的清洁卫生显得至关重要。眼镜、珠宝饰品、手表乃至日常餐厨用具&#xff0c;这些频繁接触的物品极易累积污渍与细菌。拿眼镜为例&#xff0c;缺乏定期清洁会让油渍与尘埃积累&#xff0c;进而成为细菌的温床&#xff0c;靠近眼睛使用…

SCDN是服务器吗?SCDN防御服务器有什么特点?

SCDN确实具有一定的防DDoS攻击能力&#xff0c;SCDN防御服务器有什么特点&#xff1f;高防SCDN通过结合内容分发网络&#xff08;CDN&#xff09;和分布式拒绝服务&#xff08;DDoS&#xff09;防护技术&#xff0c;提供了更全面的网络保护措施。在充满网络攻击的互联网时代&am…

dev c++输出中文乱码解决 printf乱码解决

把编码换成utf8就行 打开eiditor options

左手研发,右手销量,比亚迪舍弃了什么?

早买早享受&#xff0c;晚买享折扣&#xff0c;是近一年来汽车消费市场的真实写照。 A级家轿价格下探至6、7万元&#xff1b;曾经20万起步的主流B级车&#xff0c;如今只要12万元就能入手&#xff1b;即使是BBA等豪华品牌&#xff0c;也开始降价促销换销量。买车更便宜了&…

乐观锁、悲观锁

一、悲观锁 悲观锁 (Pessimistic Locking)&#xff0c;具有强烈的独占和排他特性。它指的是对数据被外界修改持保守态度。因此&#xff0c;在整个执行过程中&#xff0c;将处于锁定状态。所以&#xff0c;悲观锁是一种悲观思想&#xff0c;它总认为最坏的情况可能会出现&#x…

【Elasticsearch系列十五】强大特性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

没想到【C# ASP.NET + Vue】也能打造如此强大的健身房管理系统!告别传统管理,体验智能化的会员服务,课程安排竟然如此简单

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

多模态文档理解:一文读懂mPLUG-DocOwl系列模型

〔探索AI的无限可能&#xff0c;微信关注“AIGCmagic”公众号&#xff0c;让AIGC科技点亮生活〕 本文作者&#xff1a;AIGCmagic社区 刘一手 前言 随着人工智能技术的发展&#xff0c;多模态大型语言模型&#xff08;MLLMs&#xff09;在视觉-文本理解领域取得了显著进展。m…

yolov8多任务模型-目标检测+车道线检测+可行驶区域检测-yolo多检测头代码+教程

你只需看一次&#xff1a;实时且通用的多任务模型 A-YOLOM 插图 贡献 轻量化集成模型&#xff1a;我们开发了一种轻量级模型&#xff0c;能够将三个任务整合到一个统一的模型中。这对于需要实时处理的多任务场景尤其有利。自适应连接模块&#xff1a;特别为分割架构的颈部区域…

js中的 赋值 浅拷贝 和 深拷贝 详细解读

js数据类型主要分基本数据类型和引用数据类型。前者包括Number,String等&#xff0c;后者主要是Object,因此以下会针对不同的数据类型来分析,需要的朋友可以参考一下 基本数据类型&#xff08;Primary Data Types&#xff09;: String&#xff08;字符串&#xff09; Number&…

--芯片测试--

目录 芯片逻辑是什么 芯片如何选型&#xff1f; 测试策略有什么 Alpha测试和Beta测试的区别&#xff1f; 主要区别 TOPS是什么 如何计算TOPS MAC单元是什么 频率的单位是什么 如何解决跨时钟域问题&#xff1f; 解释一下对异步电路的理解&#xff0c;以及如何实现同步…