注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下

如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识

目录

1.3. 关系型数据库知识

1.3.1. 数据库概述

1.3.2. 创建数据库

1.3.3. 插入数据

1.3.4. 查询数据

1.3.5. 修改数据

1.3.6. 删除数据

1.3.7. 删除数据库

1.3.8. 完整示例demo

1.3.9. audioDB工具-创建数据库

1.3.10. audioDB工具-数据操作方法


1.3. 关系型数据库知识

1.3.1. 数据库概述

关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。不支持Worker线程。

ArkTS侧支持的基本数据类型:number、string、二进制类型数据、boolean。为保证插入并读取数据成功,建议一条数据不要超过2M。超出该大小,插入成功,读取失败。

该模块提供以下关系型数据库相关的常用功能:

  • RdbStore:提供管理关系数据库(RDB)方法的接口。
  • RdbPredicates:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
  • ResultSet:提供用户调用关系型数据库查询接口之后返回的结果集合。

1.3.2. 创建数据库

CREATE TABLE IF NOT EXISTS article (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  title TEXT NOT NULL,
  content TEXT NOT NULL,
  create_time INTEGER NOT NULL
)

创建一个文章数据库:

store?: relationalStore.RdbStore
tableName = 'article'

async createStore () {
  const store = await relationalStore.getRdbStore(getContext(this), {
    name: 'interview_tong.db',
    securityLevel: relationalStore.SecurityLevel.S1
  })
  store.executeSql(`
        CREATE TABLE IF NOT EXISTS ${this.tableName} (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          title TEXT NOT NULL,
          content TEXT NOT NULL,
          create_time INTEGER NOT NULL
        )
      `)
  this.store = store
}

aboutToAppear(): void {
  this.createStore()
}

1.3.3. 插入数据

Button('添加')
  .onClick(() => {
    this.store?.insert(this.tableName, {
      id: null,
      title: '测试' + Math.random(),
      content: '我是一篇测试文章' + Math.random(),
      create_time: Date.now()
    })
  })

1.3.4. 查询数据

interface ArticleItem extends ValuesBucket {
  id: number
  title: string
  content: string
  create_time: number
}

@Local total: number = 0
@Local list: ArticleItem[] = []

Button('查询总条数')
  .onClick(async () => {
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    const resultSet = await this.store?.query(predicates)
    this.total = resultSet?.rowCount || 0
  })

Text('总条数' + this.total)

Button('查询所有数据')
  .onClick(async () => {
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    const resultSet = await this.store?.query(predicates)
    const list: ArticleItem[] = []
    while (resultSet?.goToNextRow()) {
      list.push({
        id: resultSet.getLong(resultSet.getColumnIndex('id')),
        title: resultSet.getString(resultSet.getColumnIndex('title')),
        content: resultSet.getString(resultSet.getColumnIndex('content')),
        create_time: resultSet.getLong(resultSet.getColumnIndex('create_time'))
      })
    }
    resultSet?.close()

    this.list = list
  })

Text(JSON.stringify(this.list))

1.3.5. 修改数据

Button('修改第一条')
  .onClick(() => {
    const item = this.list[0]
    item.title = '修改标题' + Math.random()
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('id', item.id)
    this.store?.updateSync(item, predicates)
  })

1.3.6. 删除数据

Button('删除第一条')
  .onClick(() => {
    const item = this.list[0]
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('id', item.id)
    this.store?.deleteSync(predicates)
  })

1.3.7. 删除数据库

Button('删除数据库')
  .onClick(() => {
    relationalStore.deleteRdbStore(getContext(this), {
      name: 'interview_tong.db',
      securityLevel: relationalStore.SecurityLevel.S1
    })
  })

1.3.8. 完整示例demo

import { relationalStore, ValuesBucket } from '@kit.ArkData'

interface ArticleItem extends ValuesBucket {
  id: number
  title: string
  content: string
  create_time
}

@Entry
@ComponentV2
struct Demo06DataBase {
  store?: relationalStore.RdbStore
  tableName = 'article'
  @Local total: number = 0
  @Local list: ArticleItem[] = []

  async createStore () {
    const store = await relationalStore.getRdbStore(getContext(this), {
      name: 'interview_tong.db', // 数据库名字
      securityLevel: relationalStore.SecurityLevel.S1 // 安全级别
    })
    store.executeSql(`
        CREATE TABLE IF NOT EXISTS ${this.tableName} (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          title TEXT NOT NULL,
          content TEXT NOT NULL,
          create_time INTEGER NOT NULL
        )
      `)
    this.store = store
  }
  aboutToAppear(): void {
    this.createStore()
  }

  build() {
    Column() {
      Button('添加')
        .onClick(() => {
          this.store?.insert(this.tableName, {
            id: null,
            title: '测试' + Math.random(),
            content: '我是一篇测试文章' + Math.random(),
            create_time: Date.now()
          })
        })

      Button('查询总条数')
        .onClick(async () => {
          const predicates = new relationalStore.RdbPredicates(this.tableName)
          const resultSet = await this.store?.query(predicates)
          this.total = resultSet?.rowCount || 0
        })

      Text('总条数' + this.total)


      Button('查询所有数据')
        .onClick(async () => {
          const predicates = new relationalStore.RdbPredicates(this.tableName)
          // predicates.equalTo('id', 3)
          const resultSet = await this.store?.query(predicates)
          const list: ArticleItem[] = []
          while (resultSet?.goToNextRow()) {
            list.push({
              id: resultSet.getLong(resultSet.getColumnIndex('id')),
              title: resultSet.getString(resultSet.getColumnIndex('title')),
              content: resultSet.getString(resultSet.getColumnIndex('content')),
              create_time: resultSet.getLong(resultSet.getColumnIndex('create_time'))
            })
          }
          resultSet?.close()
          this.list = list
        })
      ForEach(this.list, (item: ArticleItem) => {
        Row() {
          Text('id:' +  item.id)
          Text(', title:' +  item.title)
        }
      })


      Button('修改第一条')
        .onClick(() => {
          const item = this.list[0]
          item.title = '修改标题' + Math.random()
          const predicates = new relationalStore.RdbPredicates(this.tableName)
          predicates.equalTo('id', item.id)
          this.store?.updateSync(item, predicates)
        })

      Button('删除第一条')
        .onClick(() => {
          const item = this.list[0]
          const predicates = new relationalStore.RdbPredicates(this.tableName)
          predicates.equalTo('id', item.id)
          this.store?.deleteSync(predicates)
        })

      Button('删除数据库')
        .onClick(() => {
          relationalStore.deleteRdbStore(getContext(this), {
            name: 'interview_tong.db',
            securityLevel: relationalStore.SecurityLevel.S1
          })
        })

    }
    .height('100%')
    .width('100%')
    .padding({ top: 40 })
  }
}

1.3.9. audioDB工具-创建数据库

目标:封装一个操作录音数据库的工具,提供创建数据库的方法

实现步骤:

  • 约定好数据库的表结构
  • 封装工具类,提供一个创建数据库的方法

落地代码:

1)表结构

CREATE TABLE IF NOT EXISTS interview_audio (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  user_id TEXT NOT NULL,
  name TEXT NOT NULL,
  path TEXT NOT NULL,
  duration INTEGER NOT NULL,
  size INTEGER NOT NULL
)

2)封装类

import { relationalStore } from '@kit.ArkData'

class AudioDB {
  store?: relationalStore.RdbStore
  tableName = 'interview_audio'

  // 初始化数据库
  async initStore() {
    const ctx = AppStorage.get<Context>('context')
    if (ctx) {
      const store = await relationalStore.getRdbStore(ctx, {
        name: 'interview_audio.db',
        securityLevel: relationalStore.SecurityLevel.S1
      })
      const sql = `
        CREATE TABLE IF NOT EXISTS ${this.tableName} (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          user_id TEXT NOT NULL,
          name TEXT NOT NULL,
          path TEXT NOT NULL,
          duration INTEGER NOT NULL,
          size INTEGER NOT NULL
        )
      `
      await store.executeSql(sql)
      this.store = store
    }
  }
}

1.3.10. audioDB工具-数据操作方法

目标:提供 添加 删除 查询 修改 数据库的方法

import { relationalStore, ValuesBucket } from '@kit.ArkData'
import { AppStorageV2 } from '@kit.ArkUI'
import { SavedContext } from '../../models'

export interface InterviewAudioItem extends ValuesBucket {
  id: number | null
  user_id: string
  name: string
  path: string
  duration: number
  size: number
  create_time: number
}

class AudioDB {
  store?: relationalStore.RdbStore
  tableName = 'interview_audio'

  // 初始化数据库
  async initStore() {
    const ctx = AppStorageV2.connect(SavedContext)!.context
    if (ctx) {
      const store = await relationalStore.getRdbStore(ctx, {
        name: 'interview_audio.db',
        securityLevel: relationalStore.SecurityLevel.S1
      })
      const sql = `
        CREATE TABLE IF NOT EXISTS ${this.tableName} (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          user_id TEXT NOT NULL,
          name TEXT NOT NULL,
          path TEXT NOT NULL,
          duration INTEGER NOT NULL,
          size INTEGER NOT NULL,
          create_time INTEGER NOT NULL
        )
      `
      await store.executeSql(sql)
      this.store = store
    }
  }

  // 添加
  async insert(item: InterviewAudioItem) {
    const rowId = await this.store?.insert(this.tableName, item)
    if (rowId === undefined || rowId === -1) {
      return Promise.reject('insert fail')
    } else {
      return Promise.resolve()
    }
  }

  // 删除
  async delete(id: number) {
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('id', id)
    const rowCount = await this.store?.delete(predicates)
    if (rowCount === undefined || rowCount <= 0) {
      return Promise.reject('delete fail')
    } else {
      return Promise.resolve()
    }
  }

  // 修改
  async update(item: InterviewAudioItem) {
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('id', item.id)
    const rowCount = await this.store?.update(item, predicates)
    if (rowCount === undefined || rowCount <= 0) {
      return Promise.reject('update fail')
    } else {
      return Promise.resolve()
    }
  }

  // 查询用户
  async query(userId: string) {
    const predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo('user_id', userId)
    const resultSet = await this.store?.query(predicates)
    if (!resultSet) {
      return Promise.reject('query fail')
    }
    const list: InterviewAudioItem[] = []
    while (resultSet.goToNextRow()) {
      list.push({
        id: resultSet.getLong(resultSet.getColumnIndex('id')),
        user_id: resultSet.getString(resultSet.getColumnIndex('user_id')),
        name: resultSet.getString(resultSet.getColumnIndex('name')),
        path: resultSet.getString(resultSet.getColumnIndex('path')),
        duration: resultSet.getLong(resultSet.getColumnIndex('duration')),
        size: resultSet.getLong(resultSet.getColumnIndex('size')),
        create_time: resultSet.getLong(resultSet.getColumnIndex('create_time'))
      })
    }
    resultSet.close()
    return Promise.resolve(list)
  }
}

export const audioDB = new AudioDB()

HarmonyOS赋能资源丰富度建设(第四期)-吴东林

https://developer.huawei.com/consumer/cn/training/classDetail/9fdeeb1a35d64d2fabad3948ae7aab72?type=1?ha_source=hmosclass&ha_sourceId=89000248

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐