HarmonyOS之sqlite数据库的使用

这篇具有很好参考价值的文章主要介绍了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。

HarmonyOS之sqlite数据库的使用,harmonyos,harmonyos

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文章来源地址https://www.toymoban.com/news/detail-797156.html

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)
  })
}




到了这里,关于HarmonyOS之sqlite数据库的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#如何使用SQLite数据库?

      SQLite是一个轻量级的嵌入式数据库,它的库文件非常小巧,不需要独立的服务器进程或配置。这使得它非常适合在资源受限的环境中使用,如移动设备、嵌入式系统等。与其他数据库管理系统相比,SQLite不需要进行繁琐的配置和管理。它只需要一个文件来存储整个数据库

    2024年02月12日
    浏览(50)
  • Android之SQLite数据库使用

    SQLite是Android系统集成的一个轻量级的数据库。 Android提供了 SQLiteDatabase代表一个数据库 (底层就是一个数据库文件),一旦应用程序获得了代表指定数据库的SQLiteDatabase对象,接下来可通过SQLiteDatabase对象来管理、操作数据库了。 Android为了让我们能够更加方便地管理数据库,

    2024年02月16日
    浏览(45)
  • SQLite3数据库的介绍和使用(面向业务编程-数据库)

    SQLite是一种用C语言实现的的SQL数据库 它的特点有:轻量级、快速、独立、高可靠性、跨平台 它广泛应用在全世界范围内的手机电脑应用的内建数据库 官网地址:https://www.sqlite.org/index.html SQLite因为其采用文件存储,且容易移植。在嵌入式中应用非常广泛,可以说是嵌入式业

    2024年02月02日
    浏览(48)
  • QT+SQLite数据库配置和使用

    一、简介 1.1 SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统。Qt5以上版本可以直接使用SQLite(Qt自带驱动)。 二、下载和配置 2.1 SQLite下载官网下载链接 2.2 根据计算机的配置,选择所需项目是64位还是32位下载对应的压

    2024年02月06日
    浏览(47)
  • Android开发——SQLite数据库的使用

    1、SQLite的特性 SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。 SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。

    2024年02月15日
    浏览(43)
  • Android Studio使用SQLite数据库

    1.能使用SQLiteDatabase类操作数据库与表 2.能使用SQLiteDatabaseHelper类操作数据库与表 无论是安卓应用还是苹果应用,都提供了本地轻量级数据库——SQLite,可以创建和删除数据库,还能对数据表进行增删改查操作。 SQLite由SQL编译器、内核、后端以及附件几个部分构成。SQLite通过

    2024年02月01日
    浏览(44)
  • 在C#中使用SQLite数据库

    轻量级桌面程序数据库不太适合用SQLServer、MySQL之类的重量级数据库,嵌入式数据库更好。在对比Access、SQLite、Firebird数据库后发现SQLite较另外两个有较多优点。 环境:.NET Framework 3.5、windows11 64位、Visual Studio 2010.  C#使用SQLite需要从SQLite官网下载DLL组件。 我是windows11,64位的

    2023年04月23日
    浏览(34)
  • uni-app使用sqlite数据库

    1、对数据库操作的方法进行封装; 2、使用示例:(提供创建数据库的表,新增数据的操作) 创建数据库表 以上是本人亲测有效的操作方法;有不懂的小伙伴欢迎私聊哦;有需要的也可以点赞评论加关注哦。

    2024年02月16日
    浏览(38)
  • 【C++】开源:sqlite3数据库配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍sqlite3数据库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/sqlite/sqlite SQLite 是一种嵌入式

    2024年02月14日
    浏览(54)
  • SQLITE_BUSY 是指 SQLite 数据库返回的错误码,表示数据库正在被其他进程或线程使用,因此当前操作无法完成。

    当多个进程或线程同时尝试对同一个 SQLite 数据库进行写操作时,就可能出现 SQLITE_BUSY 错误。这是为了确保数据库的数据完整性和一致性而设计的并发控制机制。 如果你在使用 SQLite 时遇到 SQLITE_BUSY 错误,可以考虑以下解决方法: 重试操作:在捕获到 SQLITE_BUSY 错误后,可以

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包