> 技术文档 > 开源 Arkts 鸿蒙应用 开发(七)数据持久--sqlite关系数据库

开源 Arkts 鸿蒙应用 开发(七)数据持久--sqlite关系数据库

  文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

  相关链接:

开源 Arkts 鸿蒙应用 开发(一)工程文件分析-CSDN博客

开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用-CSDN博客

开源 Arkts 鸿蒙应用 开发(三)Arkts的介绍-CSDN博客

开源 Arkts 鸿蒙应用 开发(四)布局和常用控件-CSDN博客

开源 Arkts 鸿蒙应用 开发(五)控件组成和复杂控件-CSDN博客

开源 Arkts 鸿蒙应用 开发(六)数据持久--文件和首选项存储-CSDN博客

开源 Arkts 鸿蒙应用 开发(七)数据持久--sqlite关系数据库-CSDN博客

开源 Arkts 鸿蒙应用 开发(八)多媒体--相册和相机-CSDN博客

开源 Arkts 鸿蒙应用 开发(九)通讯--tcp客户端-CSDN博客

开源 Arkts 鸿蒙应用 开发(十)通讯--Http数据传输-CSDN博客

 推荐链接:

开源 java android app 开发(一)开发环境的搭建-CSDN博客

开源 java android app 开发(二)工程文件结构-CSDN博客

开源 java android app 开发(三)GUI界面布局和常用组件-CSDN博客

开源 java android app 开发(四)GUI界面重要组件-CSDN博客

开源 java android app 开发(五)文件和数据库存储-CSDN博客

开源 java android app 开发(六)多媒体使用-CSDN博客

开源 java android app 开发(七)通讯之Tcp和Http-CSDN博客

开源 java android app 开发(八)通讯之Mqtt和Ble-CSDN博客

开源 java android app 开发(九)后台之线程和服务-CSDN博客

开源 java android app 开发(十)广播机制-CSDN博客

开源 java android app 开发(十一)调试、发布-CSDN博客

开源 java android app 开发(十二)封库.aar-CSDN博客

推荐链接:

开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-CSDN博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-CSDN博客

开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-CSDN博客

开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-CSDN博客

本章内容主要是sqlite数据库,在鸿蒙系统上支持sqlite关系数据库,以及向量数据库。华为给的官方例子比较复杂,开发文档的代码没办法直接运行(可能版本太旧),这里做了一个简单的sqlite的CURD的例子,以便快速使用。

1.创建SqliteHelper数据库操作类。

2.修改主页面Index.etsd代码。

3.最终显示效果。

一、创建一个SqliteHelper数据库操作类

1.1基本操作

1.2  以下为SqliteHelper.ets代码

创建名为 myDatabase.db 的数据库

数据库初始化 (initDatabase())

addPerson(): 插入新记录

deletePerson(): 按ID删除记录

deleteWithCondition(): 按条件删除记录

queryAllPersons(): 查询所有记录

queryWithCondition(): 按条件查询记录

// SqliteHelper.etsimport relationalStore from \'@ohos.data.relationalStore\';import common from \'@ohos.app.ability.common\';interface Person { id: number; name: string; age: number; email: string;}export class SqliteHelper { private rdbStore: relationalStore.RdbStore | null = null; private readonly TABLE_NAME = \'PERSON\'; private readonly CREATE_TABLE_SQL = `CREATE TABLE IF NOT EXISTS ${this.TABLE_NAME} ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, email TEXT )`; private context: common.UIAbilityContext; constructor(context: common.UIAbilityContext) { this.context = context; } async initDatabase(): Promise { try { const config: relationalStore.StoreConfig = { name: \'myDatabase.db\', securityLevel: relationalStore.SecurityLevel.S1 }; this.rdbStore = await relationalStore.getRdbStore(this.context, config); await this.rdbStore.executeSql(this.CREATE_TABLE_SQL); console.log(\'[sqlite] 数据库创建/初始化成功\'); return true; } catch (err) { console.error(\'[sqlite] 数据库初始化失败:\', JSON.stringify(err)); return false; } } async addPerson(name: string, age: number, email: string): Promise { if (!this.rdbStore) { console.error(\'[sqlite] 数据库未初始化,无法添加数据\'); return false; } try { const valueBucket: relationalStore.ValuesBucket = { \'name\': name, \'age\': age, \'email\': email }; await this.rdbStore.insert(this.TABLE_NAME, valueBucket); console.log(\'[sqlite] 添加数据成功\'); return true; } catch (err) { console.error(\'[sqlite] 添加数据失败:\', JSON.stringify(err)); return false; } } async deletePerson(id: number): Promise { if (!this.rdbStore) { console.error(\'[sqlite] 数据库未初始化,无法删除数据\'); return false; } try { const predicates = new relationalStore.RdbPredicates(this.TABLE_NAME); predicates.equalTo(\'id\', id); await this.rdbStore.delete(predicates); console.log(\'[sqlite] 删除数据成功\'); return true; } catch (err) { console.error(\'[sqlite] 删除数据失败:\', JSON.stringify(err)); return false; } } async queryAllPersons(): Promise { if (!this.rdbStore) { console.error(\'[sqlite] 数据库未初始化,无法查询数据\'); return []; } try { const predicates = new relationalStore.RdbPredicates(this.TABLE_NAME); const columns = [\'id\', \'name\', \'age\', \'email\']; const resultSet = await this.rdbStore.query(predicates, columns); const persons: Person[] = []; while (resultSet.goToNextRow()) { persons.push({ id: resultSet.getLong(resultSet.getColumnIndex(\'id\')), name: resultSet.getString(resultSet.getColumnIndex(\'name\')), age: resultSet.getLong(resultSet.getColumnIndex(\'age\')), email: resultSet.getString(resultSet.getColumnIndex(\'email\')) }); } resultSet.close(); console.log(\'[sqlite] 查询到数据:\', JSON.stringify(persons)); return persons; } catch (err) { console.error(\'[sqlite] 查询数据失败:\', JSON.stringify(err)); return []; } } // 条件删除 async deleteWithCondition(whereClause: string): Promise { if (!this.rdbStore) { console.error(\'[sqlite] 数据库未初始化,无法删除数据\'); return false; } try { const sql = `DELETE FROM ${this.TABLE_NAME} WHERE ${whereClause}`; await this.rdbStore.executeSql(sql); console.log(\'[sqlite] 条件删除成功\'); return true; } catch (err) { console.error(\'[sqlite] 条件删除失败:\', JSON.stringify(err)); return false; } } // 条件查询 async queryWithCondition(whereClause: string): Promise { if (!this.rdbStore) { console.error(\'[sqlite] 数据库未初始化,无法查询数据\'); return []; } try { const sql = `SELECT * FROM ${this.TABLE_NAME} WHERE ${whereClause}`; const resultSet = await this.rdbStore.querySql(sql); const persons: Person[] = []; while (resultSet.goToNextRow()) { persons.push({ id: resultSet.getLong(resultSet.getColumnIndex(\'id\')), name: resultSet.getString(resultSet.getColumnIndex(\'name\')), age: resultSet.getLong(resultSet.getColumnIndex(\'age\')), email: resultSet.getString(resultSet.getColumnIndex(\'email\')) }); } resultSet.close(); console.log(\'[sqlite] 条件查询结果:\', JSON.stringify(persons)); return persons; } catch (err) { console.error(\'[sqlite] 条件查询失败:\', JSON.stringify(err)); return []; } }}

二、Index.ets的代码

// Index.etsimport { SqliteHelper } from \'./SqliteHelper\';import promptAction from \'@ohos.promptAction\';import { common } from \'@kit.AbilityKit\';interface Person { id: number; name: string; age: number; email: string;}@Entry@Componentstruct Index { private sqliteHelper: SqliteHelper = new SqliteHelper(getContext(this) as common.UIAbilityContext); @State personList: Array = []; // 添加三个状态变量存储输入框内容 @State nameInput: string = \'\'; @State ageInput: string = \'\'; @State emailInput: string = \'\'; build() { Column() { Button(\'创建数据库\') .onClick(() => { this.sqliteHelper.initDatabase().then(success => { if (success) {  promptAction.showToast({ message: \'数据库创建成功\' }); } else {  promptAction.showToast({ message: \'数据库创建失败\' }); } }); }) .margin(10) // 输入姓名 TextInput({ placeholder: \'请输入姓名\' }) .width(\'90%\') .height(40) .margin(10) .onChange((value: string) => { this.nameInput = value; }) // 输入年龄 TextInput({ placeholder: \'请输入年龄\' }) .width(\'90%\') .height(40) .margin(10) .type(InputType.Number) // 设置为数字输入 .onChange((value: string) => { this.ageInput = value; }) // 输入邮箱 TextInput({ placeholder: \'请输入邮箱\' }) .width(\'90%\') .height(40) .margin(10) .onChange((value: string) => { this.emailInput = value; }) Row(){ Button(\'添加数据\') .onClick(() => { if (!this.nameInput || !this.ageInput || !this.emailInput) {  promptAction.showToast({ message: \'请填写完整信息\' });  return; } const age = parseInt(this.ageInput); if (isNaN(age)) {  promptAction.showToast({ message: \'年龄必须是数字\' });  return; } this.sqliteHelper.addPerson(this.nameInput, age, this.emailInput)  .then(success => { promptAction.showToast({  message: success ? \'数据添加成功\' : \'数据添加失败\' }); if (success) {  //this.clearInputs();  this.queryData(); // 添加成功后刷新列表 }  }); }) .margin(10) /* Button(\'删除第一条数据\') .onClick(() => { /*his.personList.length > 0) { this.sqliteHelper.deletePerson(this.personList[0].id) .then(success => {  if (success) { promptAction.showToast({ message: \'数据删除成功\' }); this.queryData();  } else { promptAction.showToast({ message: \'数据删除失败\' });  } }); } else { promptAction.showToast({ message: \'没有数据可删除\' }); } }) .margin(10) */ Button(\'条件删除\') .onClick(() => { if (!this.nameInput && !this.ageInput && !this.emailInput) {  promptAction.showToast({ message: \'请至少输入一个条件\' });  return; } // 构造删除条件 const conditions: string[] = []; if (this.nameInput) conditions.push(`name = \'${this.nameInput}\'`); if (this.ageInput) conditions.push(`age = ${parseInt(this.ageInput)}`); if (this.emailInput) conditions.push(`email = \'${this.emailInput}\'`); const whereClause = conditions.join(\' OR \'); this.sqliteHelper.deleteWithCondition(whereClause)  .then(success => { promptAction.showToast({  message: success ? \'数据删除成功\' : \'数据删除失败\' }); if (success) {  //this.clearInputs();  this.queryData(); // 添加成功后刷新列表 }  }); }) .margin(10) } Row() { Button(\'查询所有\') .onClick(() => { this.queryData(); }) .margin(10) Button(\'条件查询\') .onClick(() => { if (!this.nameInput && !this.ageInput && !this.emailInput) {  promptAction.showToast({ message: \'请至少输入一个条件\' });  return; } // 构造删除条件 const conditions: string[] = []; if (this.nameInput) conditions.push(`name = \'${this.nameInput}\'`); if (this.ageInput) conditions.push(`age = ${parseInt(this.ageInput)}`); if (this.emailInput) conditions.push(`email = \'${this.emailInput}\'`); const whereClause = conditions.join(\' OR \'); /* this.sqliteHelper.queryWithCondition(whereClause)  .then(success => { promptAction.showToast({  message: success ? \'数据查询成功\' : \'数据查询失败\' }); if (success) {  //this.clearInputs();  this.queryData(); // 添加成功后刷新列表 }  }); */ this.sqliteHelper.queryWithCondition(whereClause).then(persons => {  this.personList = persons;  if (persons.length === 0) { promptAction.showToast({ message: \'没有查询到数据\' });  } else { promptAction.showToast({ message: `查询到${persons.length}条数据` });  } }); }) .margin(10) } List({ space: 10 }) { ForEach(this.personList, (person: Person) => { ListItem() { Text(`ID: ${person.id}, 姓名: ${person.name}, 年龄: ${person.age}, 邮箱: ${person.email}`)  .fontSize(16)  .margin(10) } }, (person: Person) => person.id.toString()) } .layoutWeight(1) .width(\'100%\') } .width(\'100%\') .height(\'100%\') .padding(20) } private queryData() { this.sqliteHelper.queryAllPersons().then(persons => { this.personList = persons; if (persons.length === 0) { promptAction.showToast({ message: \'没有查询到数据\' }); } else { promptAction.showToast({ message: `查询到${persons.length}条数据` }); } }); } // 清空输入框 private clearInputs() { this.nameInput = \'\'; this.ageInput = \'\'; this.emailInput = \'\'; }}

三、最终显示效果,将手机的截图组合到一起,效果如下