开源 Arkts 鸿蒙应用 开发(七)数据持久--sqlite关系数据库
文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。
相关链接:
开源 Arkts 鸿蒙应用 开发(一)工程文件分析-CSDN博客
开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用-CSDN博客
开源 Arkts 鸿蒙应用 开发(三)Arkts的介绍-CSDN博客
开源 Arkts 鸿蒙应用 开发(四)布局和常用控件-CSDN博客
开源 Arkts 鸿蒙应用 开发(五)控件组成和复杂控件-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.ets
import 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<boolean> {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<boolean> {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<boolean> {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<Person[]> {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<boolean> {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<Person[]> {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.ets
import { SqliteHelper } from './SqliteHelper';
import promptAction from '@ohos.promptAction';
import { common } from '@kit.AbilityKit';interface Person {id: number;name: string;age: number;email: string;
}
@Entry
@Component
struct Index {private sqliteHelper: SqliteHelper = new SqliteHelper(getContext(this) as common.UIAbilityContext);@State personList: Array<Person> = [];// 添加三个状态变量存储输入框内容@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 = '';}}
三、最终显示效果,将手机的截图组合到一起,效果如下