鸿蒙5:HarmonyOS应用开发-面试录音(中)
·
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下
如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识
目录
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赋能资源丰富度建设(第四期)-吴东林
更多推荐



所有评论(0)