HarmonyOS之sqlite数据库的使用

从API Version 9开始,鸿蒙开发中sqlite使用新接口@ohos.data.relationalStore

但是  relationalStore在 getRdbStore操作时,在预览模式运行或者远程模拟器运行都会报错,导致无法使用。查了一圈说只有在真机上可以正常使用,因此这里暂且使用 @ohos.data.rdb

二者的接口非常相似,会使用了ohos.data.rdb,自然也会使用ohos.data.relationalStore

在harmonyos开发中,操作数据库时,我们通常习惯将一个功能模块数据库操作全部写在一个ets文件中并export,在界面文件中直接导入使用。

1.数据库配置以及建表

新建userDb.ets文件并添加以下代码

import data_rdb from '@ohos.data.rdb'
const STORE_CONFIG = {name: "test.db"}
const TAB_USER = "user"
const CREATE_TABLE_CODE = "CREATE TABLE IF NOT EXISTS "+TAB_USER+" ("
  + "id INTEGER PRIMARY KEY AUTOINCREMENT, "
  + "name TEXT , "
  + "age TEXT , "
  + "sex TEXT ) "
export function createTable(context) {
  data_rdb.getRdbStore(context,STORE_CONFIG, 1, function (err, rdbStore) {
    rdbStore.executeSql(CREATE_TABLE_CODE)
    console.info('create table done.')
  })
}

在User.ets界面导入并调用 

import {createTable} from '../utils/userDb'

aboutToAppear() {
    createTable(getContext(this))
}

2.插入数据

userDb.ets文件添加 insertData方法,这里需要注意的是promise的用法,因为需要将执行结果返回界面,所以方法里面多次使用了Promise来返回结果

插入的字段要和数据库字段保持一致。

export function insertData(context,list):any{
  const promise = data_rdb.getRdbStore(context,STORE_CONFIG, 1)
  return promise.then(async (rdbStore) => {
    let arr:any = [];
    for(let i:number=0; i<list.length; i++){
      const obj = list[i]
      const item ={
        name: obj.name,
        age: obj.age,
        sex: obj.sex
      }
      rdbStore.insert(TAB_USER, item);
    }
    console.log('--start')
    console.log('完了')
    return true;
  })
}

 在User.ets界面导入并调用 

import {insertData} from '../utils/userDb'

addData(){
    let array = [];
    for(let i=0; i<20; i++){
      array.push({
        name:'张飞'+i,
        age: 20+i,
        sex: '男'
      })
    }
    insertData(getContext(this), array)
      .then(res=>{
        if(res){
          this.loading = false
          this.showDialog('添加成功')
          this.search(true)
        }
      })
  }

3.查询

userDb.ets文件添加 queryDataPage方法,这里用了分页查询的方式,还有一种谓词的查询方式请参考官方文档。

export function queryDataPage(context,param):any {
  let promise = data_rdb.getRdbStore(context, STORE_CONFIG, 1)
  return promise.then(async (rdbStore) => {
    const sql: string = "select * from "+TAB_USER+" where name like ? " +
      "order by id  asc limit  ? OFFSET ? ";
    console.log('----sql---', sql)
    const pS = param.pageSize
    const page = param.page
    console.log('param.code', param.code)
    console.log('pS', pS)
    console.log('(page-1)*pS', (page - 1) * pS)
    // param.code,pS,(page-1)*pS]
    let promisequery = rdbStore.querySql(sql, [param.code, pS, (page - 1) * pS])
    return promisequery.then(async (resultSet) => {
      const rowCount = resultSet.rowCount;
      let list = [];
      console.log("rowCount --" + rowCount)
      resultSet.goToFirstRow();
      for (let i = 0; i < rowCount; i++) {
        const name = resultSet.getString(resultSet.getColumnIndex("NAME"))
        const age = resultSet.getString(resultSet.getColumnIndex("AGE"))
        const sex = resultSet.getString(resultSet.getColumnIndex("SEX"))
        const id = resultSet.getString(resultSet.getColumnIndex("ID"))
        resultSet.goToNextRow();
        const data = {
          name,
          id,
          age,
          sex,
        }
        list.push(data);
      }
      resultSet.close();
      console.log('--array--', list.length)
      return list;
    })
  }).catch((err) => {
    console.log("Get RdbStore failed, err: " + err)
  })
}

在User.ets界面导入并调用 

import {queryDataPage} from '../utils/userDb'
 @State list:Array<any> = []
 @State keyword:string = ""
 @State page:number = 1
 @State pageSize:number = 20
search(firstPage:boolean){
    if(firstPage){
      this.page = 1
    }
    const params = {
      code: '%'+this.keyword+'%',
      page: this.page,
      pageSize: this.pageSize,
    }
    queryDataPage(getContext(this), params)
      .then(data=>{
        if(data){
          console.log('res',JSON.stringify(data));
          if(this.page == 1){
            this.list = data
          } else {
            this.list = this.list.concat(data);
          }
        }
      })
  }

4.更新数据

userDb.ets文件添加 updateData方法

export  function updateData(context,newInfo):any{
  const promise = data_rdb.getRdbStore(context,STORE_CONFIG, 1)
  return promise.then(async (rdbStore) => {
    let predicates = new data_rdb.RdbPredicates(TAB_USER);
    predicates.equalTo("id", newInfo.id)
    let promiseUp = rdbStore.update(newInfo, predicates)
    return promiseUp.then(async (rows) => {
      if(rows == 1){
        return true
      }
    }).catch((err) => {
      console.info("Updated failed, err: " + err)
      return false
    })
  })
}

在User.ets界面导入并调用 

import {updateData} from '../utils/userDb'

updateOne(item:any){
    item.name = '张飞111'
    updateData(getContext(this), item)
      .then(res=>{
        if(res){
          this.showDialog('更新成功')
          this.search(true)
        }
      })
  }

5.删除数据

userDb.ets文件添加 deleteOneData方法

export function deteteOneData(context,id):any{
  const promise = data_rdb.getRdbStore(context,STORE_CONFIG, 1)
  return promise.then(async (rdbStore) => {
    let predicates = new data_rdb.RdbPredicates(TAB_USER);
    predicates.equalTo("id", id)
    const result = rdbStore.delete(predicates);
    console.log('--result--'+JSON.stringify(result))
    return true;
  })
}

在User.ets界面导入并调用 

import {deteteOneData} from '../utils/userDb'

deleteOne(id:string){
    deteteOneData(getContext(this), id)
      .then(res=>{
        if(res){
          this.showDialog('删除成功')
          this.search(true)
        }
      })
  }

6.界面效果

点击右上角Add按钮,插入数据;

点击删除按钮,删除一条数据;

点击编辑按钮,将该条数据姓名字段更新为 马超000。

7.完整代码

界面文件 User.ets

import {createTable,insertData,
  deteteOneData,updateData,
 queryDataPage} from '../utils/userDb'
@Entry
@Component
struct User {
  controller: SearchController = new SearchController()
  @State codeList:Array<any> = [];
  @State list:Array<any> = [];
  @State loading:boolean = false;
  @State keyword:string = "";
  @State page:number = 1;
  @State pageSize:number = 20;
  aboutToAppear() {
    createTable(getContext(this))
  }
  onReachEnd(){
    console.log('--------onReachEnd---');
    //this.page = this.page+1
    this.search(false)
  }
  search(firstPage:boolean){
    if(firstPage){
      this.page = 1
    }
    const params = {
      code: '%'+this.keyword+'%',
      page: this.page,
      pageSize: this.pageSize,
    }
    queryDataPage(getContext(this), params)
      .then(data=>{
        if(data){
          console.log('res',JSON.stringify(data));
          if(this.page == 1){
            this.list = data
          } else {
            this.list = this.list.concat(data);
          }
        }
      })
  }
  addData(){
    let array = [];
    for(let i=0; i<20; i++){
      array.push({
        name:'张飞'+i,
        age: 20+i,
        sex: '男'
      })
    }
    insertData(getContext(this), array)
      .then(res=>{
        if(res){
          this.loading = false
          this.showDialog('添加成功')
          this.search(true)
        }
      })
  }
  deleteOne(id:string){
    deteteOneData(getContext(this), id)
      .then(res=>{
        if(res){
          this.showDialog('删除成功')
          this.search(true)
        }
      })
  }
  updateOne(item:any){
    item.name = '马超000'
    updateData(getContext(this), item)
      .then(res=>{
        if(res){
          this.showDialog('更新成功')
          this.search(true)
        }
      })
  }
  showDialog(text:string){
    AlertDialog.show(
      {
        title: '提示',
        message: text,
        autoCancel: true,
        alignment: DialogAlignment.Center,
        gridCount: 4,
        offset: { dx: 0, dy: -20 },
        primaryButton: {
          value: '确定',
          action: () => {
            console.info('Callback when the first button is clicked')
          }
        },

      }
    )
  }
  toAddData(){
    AlertDialog.show(
      {
        title: '提示',
        message: '确定要添加数据吗',
        autoCancel: true,
        alignment: DialogAlignment.Center,
        offset: { dx: 0, dy: -20 },
        gridCount: 5,
        primaryButton: {
          value: '确定',
          action: () => {
            console.info('确定 is clicked')
            this.loading = true
            this.addData()
          }
        },
        secondaryButton: {
          value: '取消',
          action: () => {
            console.info('取消 is clicked')
          }
        },
        cancel: () => {
          console.info('Closed callbacks')
        }
      }
    )
  }
  @Builder NavigationMenus() {
    Row() {
      Text("Add")
        .width(32)
        .height(28)
        .onClick(()=>this.toAddData())
    }
  }
  @Builder buildList(){
    Row(){
      Text('姓名')
      Text('年龄')
      Text('性别')
      Text('操作')
    }.justifyContent(FlexAlign.SpaceAround)
    .width('100%')
    .padding({top:5,bottom: 10})
    List({ space: 20, initialIndex: 0 }) {
      ForEach(this.list, (item) => {
        ListItem() {
          Row(){
            Text(item.name)
            Text(item.age)
            Text(item.sex)
            Row(){
              Text('删除').onClick(()=>{
                this.deleteOne(item.id)
              }).fontColor(Color.Red)
                .margin({right:5})
              Text('编辑').onClick(()=>{
                this.updateOne(item)
              }).fontColor(Color.Blue)
            }
          }
          .justifyContent(FlexAlign.SpaceAround)
          .width('100%')

        }.editable(true)
      }, item => item.name)
    }
    .onScrollIndex((firstIndex: number, lastIndex: number) => {
      //console.info('first' + firstIndex)
      //console.info('last' + lastIndex)
    })
    .onReachEnd(()=>{
      this.onReachEnd()
    })
    .listDirection(Axis.Vertical) // 排列方向
    .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之间的分界线
    .edgeEffect(EdgeEffect.None) // 滑动到边缘无效果
    .chainAnimation(false) // 联动特效关闭
    .width('100%')
  }
  @Builder buildSearch(){
    Search({ value: this.keyword, placeholder: '请输入姓名...', controller: this.controller })
      .searchButton('搜索')
      .width('100%')
      .height(40)
      .backgroundColor('#F5F5F5')
      .placeholderColor(Color.Grey)
      .placeholderFont({ size: 14, weight: 400 })
      .textFont({ size: 14, weight: 400 })
      .onSubmit((value: string) => {
        console.log('---999')
        //this.submitValue = value
        this.keyword = value
        this.search(true)
      })
      .onChange((value: string) => {
        this.keyword = value
      })
  }
  build() {
    Column(){
      Navigation() {
        Column(){
          this.buildSearch()
          if(this.loading){
            Column(){
              LoadingProgress()
                .color(Color.Blue)
            }
            .width('40%').height('40%')
          }
          this.buildList()

        }.height('100%')
      }
      .title("用户管理")
      .menus(this.NavigationMenus)
      .titleMode(NavigationTitleMode.Mini)
    }
    .height('100%')
  }
}

数据操作文件 userDb.ets

import data_rdb from '@ohos.data.rdb'
const STORE_CONFIG = {name: "test.db"}
const TAB_USER = "user"
const CREATE_TABLE_CODE = "CREATE TABLE IF NOT EXISTS "+TAB_USER+" ("
  + "id INTEGER PRIMARY KEY AUTOINCREMENT, "
  + "name TEXT , "
  + "age TEXT , "
  + "sex TEXT ) "
export function createTable(context) {
  data_rdb.getRdbStore(context,STORE_CONFIG, 1, function (err, rdbStore) {
    rdbStore.executeSql(CREATE_TABLE_CODE)
    console.info('create table done.')
  })
}
export  function updateData(context,newInfo):any{
  const promise = data_rdb.getRdbStore(context,STORE_CONFIG, 1)
  return promise.then(async (rdbStore) => {
    let predicates = new data_rdb.RdbPredicates(TAB_USER);
    predicates.equalTo("id", newInfo.id)
    let promiseUp = rdbStore.update(newInfo, predicates)
    return promiseUp.then(async (rows) => {
      if(rows == 1){
        return true
      }
    }).catch((err) => {
      console.info("Updated failed, err: " + err)
      return false
    })
  })
}
export function insertData(context,list):any{
  const promise = data_rdb.getRdbStore(context,STORE_CONFIG, 1)
  return promise.then(async (rdbStore) => {
    let arr:any = [];
    for(let i:number=0; i<list.length; i++){
      const obj = list[i]
      const item ={
        name: obj.name,
        age: obj.age,
        sex: obj.sex
      }
      rdbStore.insert(TAB_USER, item);
    }
    console.log('--start')
    console.log('完了')
    return true;
  })
}
export function deteteOneData(context,id):any{
  const promise = data_rdb.getRdbStore(context,STORE_CONFIG, 1)
  return promise.then(async (rdbStore) => {
    let predicates = new data_rdb.RdbPredicates(TAB_USER);
    predicates.equalTo("id", id)
    const result = rdbStore.delete(predicates);
    console.log('--result--'+JSON.stringify(result))
    return true;
  })
}
export function detelteAllCode(context){
  data_rdb.getRdbStore(context,STORE_CONFIG, 1, function (err, rdbStore) {
    rdbStore.executeSql("delete from "+TAB_USER)
    console.info('--delete code done.')
  })

}
export function queryDataPage(context,param):any {
  let promise = data_rdb.getRdbStore(context, STORE_CONFIG, 1)
  return promise.then(async (rdbStore) => {
    const sql: string = "select * from "+TAB_USER+" where name like ? " +
      "order by id  asc limit  ? OFFSET ? ";
    console.log('----sql---', sql)
    const pS = param.pageSize
    const page = param.page
    console.log('param.code', param.code)
    console.log('pS', pS)
    console.log('(page-1)*pS', (page - 1) * pS)
    // param.code,pS,(page-1)*pS]
    let promisequery = rdbStore.querySql(sql, [param.code, pS, (page - 1) * pS])
    return promisequery.then(async (resultSet) => {
      const rowCount = resultSet.rowCount;
      let list = [];
      console.log("rowCount --" + rowCount)
      resultSet.goToFirstRow();
      for (let i = 0; i < rowCount; i++) {
        const name = resultSet.getString(resultSet.getColumnIndex("NAME"))
        const age = resultSet.getString(resultSet.getColumnIndex("AGE"))
        const sex = resultSet.getString(resultSet.getColumnIndex("SEX"))
        const id = resultSet.getString(resultSet.getColumnIndex("ID"))
        resultSet.goToNextRow();
        const data = {
          name,
          id,
          age,
          sex,
        }
        list.push(data);
      }
      resultSet.close();
      console.log('--array--', list.length)
      return list;
    })
  }).catch((err) => {
    console.log("Get RdbStore failed, err: " + err)
  })
}




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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot框架篇】35.kafka环境搭建和收发消息

kafka环境搭建 kafka依赖java环境,如果没有则需要安装jdk yum install java-1.8.0-openjdk* -y1.下载安装kafka kafka3.0版本后默认自带了zookeeper&#xff0c;3.0之前的版本需要单独再安装zookeeper,我使用的最新的3.6.1版本。 cd /usr/local wget https://dlcdn.apache.…

无监督去噪的一个变迁(1)——N2N→N2V→HQ-SSL

目录 1. 前沿2. N2N3. N2V——盲点网络&#xff08;BSNs&#xff0c;Blind Spot Networks&#xff09;开创者3.1. N2V实际是如何训练的&#xff1f; 4. HQ-SSL——认为N2V效率不够高4.1. HQ-SSL的理论架构4.1.1. 对卷积的改进4.1.2. 对下采样的改进4.1.3. 比N2V好在哪&#xff…

计算机毕业设计 基于Java的美食信息推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

ARM day2、day3 汇编

一、汇编学习&#xff1a;可以向上理解软件、向下感知硬件 二、符号&#xff08;注释&#xff09; 注释#注释&#xff08;放在行首表示注释一行&#xff09;/* */注释#数字立即数&#xff1a;一种标号&#xff08;比如main: loop:&#xff09;.text .end换行…

spingboot 集成identityserver4身份验证

一、新建项目&#xff1a;com.saas.swaggerdemo 详情见&#xff1a;spring-boot2.7.8添加swagger-CSDN博客 在之前项目基础上添加如下依赖 <dependency><groupId>com.nimbusds</groupId><artifactId>nimbus-jose-jwt</artifactId><version&…

java版微信小程序商城 免 费 搭 建 java版直播商城平台规划及常见的营销模式有哪些?电商源码/小程序/三级分销

涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis …

7.5 MySQL对数据的基本操作(❤❤❤)

7.5 MySQL对数据的基本操作 1. 提要2. 数据添加2.1 insert语法2.2 insert 子查询2.3 ignore关键字 3. 数据修改3.1 update语句3.2 update表连接 4. 数据删除4.1 delete语句4.2 delete表连接4.3 快速删除数据表全部数据 1. 提要 2. 数据添加 2.1 insert语法 2.2 insert 子查询 …

Java实现在线编辑预览office文档

文章目录 1 在线编辑1.1 PageOffice简介1.2 前端项目1.2.1 配置1.2.2 页面部分 1.3 后端项目1.3.1 pom.xml1.3.2 添加配置1.3.3 controller 2 在线预览2.1 引言2.2 市面上现有的文件预览服务2.2.1 微软2.2.2 Google Drive查看器2.2.3 阿里云 IMM2.2.4 XDOC 文档预览2.2.5 Offic…

8个Python必备的PyCharm插件

大家好&#xff0c;在PyCharm中浏览插件列表并尝试很多人推荐的插件后&#xff0c;总结了几个瑰宝插件&#xff0c;它们各自以独特的方式帮助开发者快速、简便、愉悦地开发&#xff0c;接下来将逐个介绍它们。 1. Key Promoter X 【下载链接】&#xff1a;https://plugins.je…

Enzo Life Sciences--DNA损伤酶联免疫检测试剂盒DNA damage ELISA kit

——用于肿瘤、细胞凋亡和氧化应激研究中DNA损伤的快速检测 细胞暴露于氧化和环境应激经常导致基因组DNA的分解或氧化&#xff0c;评价基因组DNA完整性或评估氧化DNA存在的测定法经常用作验证凋亡或DNA损伤开始的手段。8-羟基-2 -脱氧鸟苷(8-OHdG)是一种修饰的核苷碱基&#xf…

vba设置excel单元格背景色

vba设置excel单元格背景色位蓝色 Sheet1.Cells(hang, 2).Interior.Color RGB(0, 0, 255) 参考链接 【VBA】给单元格设置背景色_vba 将一行底色置绿色-CSDN博客https://blog.csdn.net/s_h_m114_2/article/details/105787093 参考2 知乎 VBA--单元格的背景色设置 特此…

potplayer在投屏中的使用

视频播放完成之后自动停止 配置/语言/其他->收尾处理->播放完当前后停止 任务栏控制播放 快捷键 Enter 屏幕->全屏 CtrlEnter 屏幕->全屏(拉伸) CtrlShiftEnter 屏幕->全屏(其他显示器) AltEnter 屏幕->全屏 CtrlAltEnter 屏幕->全屏(保持比例) Space…

flink1.15 维表join guava cache和mysql方面优化

优化前 mysql响应慢,导致算子中数据输出追不上输入,导致显示cpu busy:100% 优化后效果两个图对应两个时刻: - - -- 优化前 select l.id,JSON_EXTRACT(r.msg,$$.key1) as msgv (select id,uid from tb1 l where id?) join (select uid,msg from tb2) r on l.uidr.uid;-- 优化…

STC51+TLC2543+ADXL335+proteus

51单片机解析adxl335振动检测蜂鸣器报警课设 通过按键调整振动检测阈值 传感器介绍 TLC2543&#xff1a;12 位精密模数转换器&#xff0c;原理图与引脚功能描述如下所示&#xff1a; 引脚功能1~9、11、12模拟量输入通道10GND电源地13REF-为负基准电压端14REF为正基准电压端…

腾讯云服务器入门教程——从0到1新手必看

腾讯云服务器入门教程包括云服务器CPU内存带宽配置选择&#xff0c;选择云服务器CVM或轻量应用服务器&#xff0c;云服务器创建后重置密码、远程连接、搭建程序环境、部署Web网站应用等&#xff0c;腾讯云服务器网txyfwq.com分享从0到1腾讯云服务器入门教程&#xff1a; 腾讯云…

记录在PyCharm中编辑配置自己的项目环境或路径

我们在复现或则跑项目时往往会遇到“设置参数” # 设置参数 ap argparse.ArgumentParser() ap.add_argument("-i", "--image", requiredTrue, help"path to input image") ap.add_argument("-t", "--template", requiredT…

【已解决】c语言const/指针学习笔记

本博文源于笔者正在复习const在左与在右&#xff0c;指针优先级、a,&a,*a的区别。 1、const在左与在右 int const *p const int *p int * const p int const * const p const int * const p* 在const右边&#xff0c;指向的数据不可以改变&#xff0c;可以改变地址 * 在c…

史上最全的数据科学与艺术

1.背景介绍 数据分析是一种将数据转化为价值的艺术和科学。它涉及到大量的数学、统计、编程、数据库、机器学习等多个领域的知识。数据分析的目的是从数据中提取有用的信息&#xff0c;以便做出明智的决策。 数据分析的艺术体现在数据分析师需要具备丰富的经验和洞察力&#…

SAP 客制化增强查找

相信各位在做日常的实施和运维中&#xff0c;经常会遇到这样一种情况&#xff0c;系统出现了非常规问题&#xff0c; 每次哼哧哼哧看半天源码&#xff0c;各种打watch point, 最后发现是以前别人写的增强导致的&#xff0c; 真的非常浪费时间。 那么我就想&#xff0c;有没有…

苹果手机自动重启是什么原因?本文帮你解决问题!

苹果手机是许多用户信赖和喜爱的手机品牌之一&#xff0c;但有时候它可能也会出现一些问题&#xff0c;其中比较常见的就是手机自动重启。那么&#xff0c;苹果手机自动重启是什么原因呢&#xff1f;今天&#xff0c;小编将在本文为您分析可能的原因&#xff0c;并提供相对应的…