ArkTS基于SQLite数据库的增删改查

一、SQLite数据库

        SQLite 是一款轻量级、嵌入式、无服务器的关系型数据库管理系统。

二、SQLite数据库的特点

        1.轻量级与无服务器架构。整个数据库仅由一个文件构成(通常为.db.sqlite格式),无需独立的数据库服务器进程;库文件体积小(约 500KB-1MB),可直接嵌入应用程序中运行。

        2.跨平台兼容性好。支持多中操作系统。

        3.高性能与低资源消耗。

        4.事务安全性。支持完整的 ACID(原子性、一致性、隔离性、持久性)事务。事务可确保数据操作要么完全成功,要么完全回滚,避免数据不一致。

        5.动态类型系统。字段不强制绑定数据类型,值的类型由内容决定。支持 NULL、INTEGER、REAL(浮点数)、TEXT、BLOB(二进制数据)五种基本数据类型。

三、ArkTS基于SQLite数据库的增删改查

        1.构建学生类
class Student {
  id: number = 0
  username: string
  age: number = 0

  constructor(id: number, username: string, age: number) {
    this.id = id
    this.username = username
    this.age = age
  }
}

export default Student
        2.设计工具类:操作数据库
import { relationalStore } from "@kit.ArkData"
import Student from "../model/Stu"
import { BusinessError } from "@kit.BasicServicesKit"

//工具类
class RdbUtils {
  //数据库的操作对象
  private static rdbStore: relationalStore.RdbStore

  static setStore(store: relationalStore.RdbStore) {
    RdbUtils.rdbStore = store
  }

  static getStore(): relationalStore.RdbStore {
    return RdbUtils.rdbStore
  }

  static executeSql(sql: string): Promise<void> {

    return RdbUtils.getStore().executeSql(sql)
  }

  //======查询数据======//
  static queryAll(): Promise<Array<Student>> {
    let prodicates = new relationalStore.RdbPredicates("STUDENT")

    return new Promise<Array<Student>>((resolve, reject) => {
      RdbUtils.getStore().query(prodicates).then((result) => {

        let arrays = new Array<Student>()
        while (result.goToNextRow()) {
          let stu = new Student(result.getLong(0), result.getString(1), result.getLong(2))
          arrays.push(stu)
        }
        resolve(arrays)
      }).catch((error: BusinessError) => {
      })
    })
  }

  //======插入数据======//
  static insert(tableName: string, data: relationalStore.ValuesBucket): Promise<number> {

    return RdbUtils.getStore().insert(tableName, data)

  }

  //======修改数据======//
  static updateInfo(id: number, data: relationalStore.ValuesBucket): Promise<number> {
    let prodicates = new relationalStore.RdbPredicates("STUDENT")
    prodicates.equalTo("ID", id)

    return RdbUtils.getStore().update(data, prodicates)

  }

  //======删除数据======//
  static deleteInfo(id: number): Promise<number> {
    let prodicates = new relationalStore.RdbPredicates("STUDENT")
    prodicates.equalTo("ID", id)
    return RdbUtils.getStore().delete(prodicates)

  }
}

export default RdbUtils
        3.创建数据库:在EntryAbility文件中

    //创建数据库
    const STORE_CONFIG: relationalStore.StoreConfig= {
      name: 'RdbTest.db',
      securityLevel: relationalStore.SecurityLevel.S3,
      encrypt: false,
      customDir: 'customDir/subCustomDir',
      isReadOnly: false
    };
    relationalStore.getRdbStore(this.context,STORE_CONFIG,(error,store)=>{
      if(error)
      {
        console.log("创建数据库失败")
        return
      }
      console.log("创建数据库成功")

      RdbUtils.setStore(store)
    })
        4.构建首页页面:添加按钮,分别实现功能:数据库的创建,查询数据,添加新数据、修改数据、删除数据,并跳转至对应的页面
import RdbUtils from "../utils/Rdbutils"
import { BusinessError } from "@kit.BasicServicesKit"
import { promptAction, router } from "@kit.ArkUI"


@Entry
@Component
struct Chapter5 {
  @State nameText: string = ''
  @State ageText: string = ''

  build() {
    Column({ space: 20 }) {

      Text("sqltie数据库操作").fontSize(40).fontColor(0x87CEFA).margin({ bottom: 80 })

      //===========创建数据库表=============//
      Button("创建数据库表").fontSize(30).width("80%").onClick((event: ClickEvent) => {
        const sql =
          "CREATE  TABLE  IF NOT  EXISTS  STUDENT (ID  INTEGER PRIMARY KEY AUTOINCREMENT,USERNAME TEXT NOT NULL,AGE INTEGER)"
        RdbUtils.executeSql(sql).then(() => {
          promptAction.showToast({
            message: "创建数据库成功"
          })
        }).catch((err: BusinessError) => {
          promptAction.showToast({
            message: "创建数据库失败"
          })
        })
      })
      //============查询数据=============//
      Button("查询数据").fontSize(30).width("80%")
        .onClick((event: ClickEvent) => {
          //触发点击事件,跳转页面至Chapter7
          router.pushUrl({
            url: "pages/Chapter7"
          })
        })
      //=========插入数据==========//
      Button("添加新数据").fontSize(30).width("80%")
        .onClick((event: ClickEvent) => {
          router.pushUrl({
            url: "pages/Chapter6"
          })
        })
      //======修改数据========//
      Button("修改数据").fontSize(30).width("80%")
        .onClick(() => {
          //跳转页面至Chapter8
          router.pushUrl({
            url: "pages/Chapter8"
          })
        })
      //=======删除数据========//
      Button("删除数据").fontSize(30).width("80%")
        .onClick((event: ClickEvent) => {
          router.pushUrl({
            url: "pages/Chapter7"
          })
        })
    }.width("100%").height("100%").justifyContent(FlexAlign.Center)
  }
}
         5.构建功能页1:实现功能:查询数据库和删除数据功能
import Student from '../model/Stu';
import RdbUtils from '../utils/Rdbutils';
import { promptAction, router } from '@kit.ArkUI';

@Entry
@Component
struct Chapter7 {
  @State sqltie: string = '';
  @State idText: number = 0

  build() {
    Column({ space: 20 }) {
      Text("数据库信息").fontSize(40).fontColor(0x00BFFF).margin({ top: 20 })
      Button("点击查询数据").fontSize(30).width("80%")
        .onClick((event: ClickEvent) => {
          RdbUtils.queryAll().then((stus: Array<Student>) => {
            let stuInfo = JSON.stringify(stus)
            promptAction.showToast({
              message: "查询数据成功" + stuInfo
            })
            this.sqltie = stuInfo

          }).catch(() => {
            promptAction.showToast({
              message: "查询数据失败,请稍后重试"
            })
          })
        })

      //删除功能
      TextInput({ placeholder: "请输入您想删除数据的ID" }).width("80%").height("6%")
        .placeholderColor(Color.Red)
        .onChange((value: string) => {
          this.idText = Number(value)
        })
      Button("点击删除").fontSize(30).width("80%").onClick((event: ClickEvent) => {
        RdbUtils.deleteInfo(this.idText).then((result) => {
          promptAction.showToast({
            message: "删除数据,数据成功" + result
          })

        }).catch(() => {
          promptAction.showToast({
            message: "服务器繁忙,请稍后再试"
          })
        })
      })

      //显示数据信息
      Scroll() {
        Text(this.sqltie).fontSize(22).fontColor(0x7B68EE)
      }.width("100%").height("50%")

      //返回功能页按钮
      Button("返回功能页").fontSize(30).width("80%")
        .onClick((event: ClickEvent) => {
          router.pushUrl({
            url: "pages/Chapter5"
          })
        })
    }.width("100%").height("100%")
  }
}
        6.构建功能页2:添加新数据
import { relationalStore } from '@kit.ArkData';
import RdbUtils from '../utils/Rdbutils';
import { promptAction, router } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct Chapter6 {
  @State message: string = '注册新用户';
  @State nameText: string = ''; //存储姓名
  @State ageText: string = ''; //存储年龄

  build() {
    Column({ space: 20 }) {

      Text(this.message).fontSize(40).fontColor(0x00BFFF)

      //文本输入框,请输入姓名
      TextInput({ placeholder: "请输入姓名" })
        .width("80%").height("8%")
        .onChange((value: string) => {
          this.nameText = value
        })

      //文本输入框,请输入年龄
      TextInput({ placeholder: "请输入年龄" })
        .width("80%").height("8%")
        .onChange((value: string) => {
          this.ageText = value
        })

      //创建按钮,绑定点击事件
      Button("添加到数据库").fontSize(30).width("80%")
        .onClick((event: ClickEvent) => {
          console.log(this.nameText, this.ageText)
          const valueBucket: relationalStore.ValuesBucket = {
            "USERNAME": this.nameText,
            "AGE": this.ageText
          }
          RdbUtils.insert("STUDENT", valueBucket).then((count) => {

            promptAction.showToast({
              message: "插入数据成功" + count
            })

          }).catch((error: BusinessError) => {

            promptAction.showToast({
              message: "创建数据失败"
            })
          })
        })

      //返回Chapter5页面
      Button("返回功能页").fontSize(30).width("80%")
        .onClick((event: ClickEvent) => {
          router.pushUrl({
            url: "pages/Chapter5"
          })
        })
    }.width("100%").height("100%")
  }
}
        7.构建功能页3:实现修改数据功能
import { promptAction, router } from '@kit.ArkUI';
import { relationalStore } from '@kit.ArkData';
import RdbUtils from '../utils/Rdbutils';

@Entry
@Component
struct Chapter8 {
  @State nameText: string = ""
  @State ageText: string = ""
  @State idText: number = 0

  build() {
    Column({ space: 20 }) {
      Text("修改信息").fontSize(40).fontColor(0x00BFFF).margin({ top: 20 })
      //返回查询页Chapter7
      Button("点击查询数据").fontSize(30).width("80%")
        .onClick((event: ClickEvent) => {
          router.pushUrl({
            url: "pages/Chapter7"
          })
        })
      //======修改数据=========//
      //文本输入框,请输入ID
      TextInput({ placeholder: "请输入您想修改数据的ID" }).width("80%").height("6%")
        .placeholderColor(Color.Green)
        .onChange((value: string) => {
          this.idText = Number(value)
        })
      //文本输入框,请输入姓名
      TextInput({ placeholder: "请输入姓名" })
        .width("80%").height("6%")
        .placeholderColor(Color.Green)
        .onChange((value: string) => {
          this.nameText = value
        })

      //文本输入框,请输入年龄
      TextInput({ placeholder: "请输入年龄" })
        .width("80%").height("6%")
        .placeholderColor(Color.Green)
        .onChange((value: string) => {
          this.ageText = value
        })
      Button("点击修改数据").fontSize(30).width("80%")
        .onClick((event: ClickEvent) => {
          const valueBucket: relationalStore.ValuesBucket = {
            "USERNAME": this.nameText,
            "AGE": this.ageText
          }
          RdbUtils.updateInfo(this.idText, valueBucket).then((result) => {

            promptAction.showToast({
              message: "更新数据,数据成功" + result
            })

          }).catch(() => {
          })
        })
      //返回功能页按钮
      Button("返回功能页").fontSize(30).width("80%")
        .onClick((event: ClickEvent) => {
          router.pushUrl({
            url: "pages/Chapter5"
          })
        })
    }.width("100%").height("100%")
  }
}
        数据库文件的存放位置:

        打开模拟器,运行效果:

                 

                

在鸿蒙元服务开发中,SQLite 因轻量级、无服务器等优势,成为鸿蒙应用本地数据管理的理想选择,结合鸿蒙开发语言 ArkTS 可实现对本地数据库增删改查操作。 ### 开发准备 在进行操作前,需完成权限配置,不过引用中未详细说明具体配置内容 [^1]。 ### 创建数据库与表结构 以下是创建数据库和表的示例代码: ```typescript import data_rdb from '@ohos.data.rdb' const CREATE_TABLE_TEST = "CREATE TABLE IF NOT EXISTS test (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "name TEXT NOT NULL, " + "age INTEGER, " + "salary REAL, " + "blobType BLOB)"; const STORE_CONFIG = {name: "rdbstore.db"} data_rdb.getRdbStore(this.context, STORE_CONFIG, 1, function (err, rdbStore) { rdbStore.executeSql(CREATE_TABLE_TEST) console.info('create table done.') }) ``` 上述代码通过 `data_rdb.getRdbStore` 方法获取 RDB 存储实例,然后执行 SQL 语句创建 `test` 表 [^3]。 ### 插入数据 插入数据时,需构造以 `ValuesBucket` 形式存储的数据,并调用关系型数据库提供的插入接口。虽然引用未给出具体插入代码示例,但一般步骤是先创建 `ValuesBucket` 对象并添加数据,再调用 `rdbStore.insert` 方法。示例代码如下: ```typescript import data_rdb from '@ohos.data.rdb'; import { ValuesBucket } from '@ohos.data.rdb'; // 获取 rdbStore 实例,这里假设已经获取到 rdbStore let values = new ValuesBucket(); values.putString('name', 'John'); values.putInt('age', 30); values.putDouble('salary', 5000.0); // 假设 rdbStore 已正确初始化 rdbStore.insert('test', values, (err, id) => { if (err) { console.error('Insert data failed: ' + err); } else { console.info('Insert data success, inserted id: ' + id); } }); ``` ### 删除数据 删除数据可使用 `relationalStore.RdbPredicates` 来匹配待删除的数据行。示例代码如下: ```typescript // 假设 AccountData 是自定义的数据类型,CommonConstants 是包含表名等常量的对象 function deleteData(account, callback) { let predicates = new relationalStore.RdbPredicates(CommonConstants.ACCOUNT_TABLE.tableName); // 根据 id 匹配待删除的数据行 predicates.equalTo('id', account.id); this.accountTable.deleteData(predicates, callback); } ``` 上述代码根据 `id` 匹配待删除的数据行,然后调用 `deleteData` 方法删除数据 [^2]。 ### 修改数据 引用中未给出修改数据的示例,但一般做法是构造要更新的数据,使用 `RdbPredicates` 确定要更新的行,然后调用更新接口。示例代码如下: ```typescript import data_rdb from '@ohos.data.rdb'; import { ValuesBucket } from '@ohos.data.rdb'; // 假设 rdbStore 已正确初始化 let values = new ValuesBucket(); values.putString('name', 'New Name'); let predicates = new data_rdb.RdbPredicates('test'); predicates.equalTo('id', 1); rdbStore.update(values, 'test', predicates, (err, num) => { if (err) { console.error('Update data failed: ' + err); } else { console.info('Update data success, updated rows: ' + num); } }); ``` ### 查询数据 引用未给出查询数据示例,一般可通过 `query` 方法进行查询。示例代码如下: ```typescript import data_rdb from '@ohos.data.rdb'; // 假设 rdbStore 已正确初始化 let predicates = new data_rdb.RdbPredicates('test'); predicates.equalTo('id', 1); rdbStore.query(predicates, ['id', 'name', 'age', 'salary'], (err, resultSet) => { if (err) { console.error('Query data failed: ' + err); } else { resultSet.goToFirstRow(); if (!resultSet.isAtEnd()) { let id = resultSet.getInt(0); let name = resultSet.getString(1); let age = resultSet.getInt(2); let salary = resultSet.getDouble(3); console.info(`Query result: id=${id}, name=${name}, age=${age}, salary=${salary}`); } resultSet.close(); } }); ```
### HarmonyOS 中使用 ArkTS 进行数据库增删改查的操作指南 在 HarmonyOS 开发中,ArkTS 提供了对关系型数据库的支持,开发者可以通过 SQLite 组件实现本地数据库的管理[^2]。以下是基于 ArkTS数据库增删改查操作方法及示例代码。 #### 1. 数据库初始化 在进行增删改查操作之前,需要先创建数据库并定义表结构。 ```typescript import relationalStore from '@ohos.data.relationalStore'; async function initializeDatabase() { const dbName = 'example.db'; // 数据库名称 const dbProperties = new relationalStore.DatabaseProperties(); // 创建数据库属性对象 dbProperties.setDbName(dbName); // 设置数据库名称 dbProperties.setCreateIfMissing(true); // 如果数据库不存在,则创建 try { const database = await relationalStore.openDatabase(dbProperties); // 打开或创建数据库 await database.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)'); console.log('数据库初始化成功'); } catch (error) { console.error('数据库初始化失败:', error); } } ``` #### 2. 插入数据 通过 `execute` 方法执行 SQL 插入语句,将数据写入表中。 ```typescript async function insertData() { const dbName = 'example.db'; const dbProperties = new relationalStore.DatabaseProperties(); dbProperties.setDbName(dbName); try { const database = await relationalStore.openDatabase(dbProperties); await database.execute('INSERT INTO users (name, age) VALUES (?, ?)', ['Alice', 25]); console.log('数据插入成功'); } catch (error) { console.error('数据插入失败:', error); } } ``` #### 3. 查询数据 使用 `query` 方法从数据库中检索数据,并处理结果集。 ```typescript async function queryData() { const dbName = 'example.db'; const dbProperties = new relationalStore.DatabaseProperties(); dbProperties.setDbName(dbName); try { const database = await relationalStore.openDatabase(dbProperties); const result = await database.query('SELECT * FROM users'); while (result.goToNextRow()) { const id = result.getInt(0); // 获取第一列(id) const name = result.getString(1); // 获取第二列(name) const age = result.getInt(2); // 获取第三列(age) console.log(`ID: ${id}, Name: ${name}, Age: ${age}`); } result.close(); // 关闭结果集 } catch (error) { console.error('数据查询失败:', error); } } ``` #### 4. 更新数据 通过 `execute` 方法执行 SQL 更新语句,修改表中的记录。 ```typescript async function updateData() { const dbName = 'example.db'; const dbProperties = new relationalStore.DatabaseProperties(); dbProperties.setDbName(dbName); try { const database = await relationalStore.openDatabase(dbProperties); await database.execute('UPDATE users SET age = ? WHERE name = ?', [30, 'Alice']); console.log('数据更新成功'); } catch (error) { console.error('数据更新失败:', error); } } ``` #### 5. 删除数据 通过 `execute` 方法执行 SQL 删除语句,移除表中的记录。 ```typescript async function deleteData() { const dbName = 'example.db'; const dbProperties = new relationalStore.DatabaseProperties(); dbProperties.setDbName(dbName); try { const database = await relationalStore.openDatabase(dbProperties); await database.execute('DELETE FROM users WHERE name = ?', ['Alice']); console.log('数据删除成功'); } catch (error) { console.error('数据删除失败:', error); } } ``` 以上代码展示了如何在 HarmonyOS 中使用 ArkTS 实现数据库增删改查功能[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值