Harmony os Next——关系型数据库relationalStore.RdbStore的使用

2024-06-02 14:44

本文主要是介绍Harmony os Next——关系型数据库relationalStore.RdbStore的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Harmony os Next——关系型数据库relationalStore.RdbStore的使用

  • 描述
  • 数据库的使用
    • 建表
      • 定义表信息
      • 创建数据库表
    • 创建数据库操作对象
    • 更新
    • 查询
    • 数据库的初始化

描述

本文通过存储一个简单的用户信息到数据库中为例,进行阐述relationalStore.RdbStore数据库的CRUD相关操作

数据库的使用

若是使用频繁,可以创建一个单例类进行管理存储到数据库的用户信息

export class UserProfileManagerUtil{private constructor() {}private static instance: UserProfileManagerUtil | null = nullpublic static getInstance(): UserProfileManagerUtil{if (UserProfileManagerUtil.instance == null) {UserProfileManagerUtil.instance = new UserProfileManagerUtil()}return UserProfileManagerUtil.instance}}

建表

定义表信息

通过SQL语句建立一个数据库表。在此之前定义数据库名称和用户信息表名以及用户信息表中的字段,此处为了简介,便只定义三个字断

  private static readonly DATABASE_NAME = "AppDataBase.db" //数据库名称private static readonly USER_PROFILE_TABLE_NAME = "UserProfile" //表名private static readonly COL_USERNAME = "USERNAME" private static readonly COL_AGE = "AGE" private static readonly COL_SEX = "SEX" 

配置数据库信息以及是否加密等

   private static readonly STORE_CONFIG :relationalStore.StoreConfig= {name: UserProfileManagerUtil.DATABASE_NAME, // 数据库文件名securityLevel: relationalStore.SecurityLevel.S1, // 数据库安全级别encrypt: true // 可选参数,指定数据库是否加密,默认不加密}

创建数据库表

下列SQL语句格式需要特别注意,不然容易在创建表的时候出错,下列以USERNAME为主键

  private static readonly CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + UserProfileManagerUtil.USER_PROFILE_TABLE_NAME + " ( " +UserProfileManagerUtil.COL_USERNAME + " TEXT PRIMARY KEY, " +UserProfileManagerUtil.COL_AGE + " INTEGER, " +UserProfileManagerUtil.COL_SEX + " INTEGER" +")"

创建数据库操作对象

根据上面的数据库配置信息和SQL建表语句,创建数据库操作对象relationalStore.getRdbStore
同时需要注意的是应用创建的数据库与其上下文(Context)有关,即使使用同样的数据库名称,但不同的应用上下文,会产生多个数据库,例如每个UIAbility都有各自的上下文。所以一般都在对应的UIAbility下先进行创建。确保在其UIAbility的可行性和唯一性

 // 应用创建的数据库与其上下文(Context)有关,即使使用同样的数据库名称,但不同的应用上下文,会产生多个数据库,例如每个UIAbility都有各自的上下文。async createDataBase(context: Context) {try {let store = await relationalStore.getRdbStore(context, UserProfileManagerUtil.STORE_CONFIG)if (store){this.storeInstance = storeawait this.storeInstance.executeSql(UserProfileManagerUtil.CREATE_TABLE) //创建数据库}} catch (error) {Logger.error(`the result is failed of create DB,the cause is ${(error as BusinessError).message}`)}}

根据上述创建的数据库操作对象进行插入操作,其中ValuesBucket使用键值对的方式进行数据匹对

  insertUserProfile(userProfile: UserProfileModel){let insertFormat: ValuesBucket = {'USERNAME' : userProfile.id,'AGE' : userProfile.avatar,'SEX' : userProfile.name}try {this.storeInstance?.insert(UserProfileManagerUtil.USER_PROFILE_TABLE_NAME, insertFormat, (err, rowId)=>{if (err) {Logger.error(`insert failed,the cause is ${err.message}`)return}//插入成功Logger.info(`insert successful,the rowId is ${rowId}`)})} catch (error) {Logger.error(`insert failed,the cause is ${(error as BusinessError).message}`)}}

更新

下列通过predicates.equalTo查找数据库表中对应的数据项,然后根据ValuesBucket中的内容定位到需要进行数据更新的字段,下列以更新年龄为例子。

  updateAge(primaryKey: string, age: number){try {let predicates = new relationalStore.RdbPredicates(UserProfileManagerUtil.USER_PROFILE_TABLE_NAME) // 创建表的predicates-谓词predicates.equalTo(UserProfileManagerUtil.COL_USERNAME, primaryKey) // 匹配表中主键为key(username)的字段let updateFormat: ValuesBucket = {'AGE' : age}this.storeInstance?.update(updateFormat, predicates, (err: BusinessError, rows: number) => {if (err) {Logger.error(`update failed,the cause is ${err.message}`)return}//更新数据成功Logger.info(`update successful,the rowId is ${rows}`)})} catch (error) {Logger.error(`update failed,the cause is ${(error as BusinessError).message}`)}}

查询

定义数据库查询SQL语句

let sql = "select * from " + UserProfileManagerUtil.USER_PROFILE_TABLE_NAME

通过querySql查询数据库表中的内容,然后通过遍历查询结果,并取出其中的内容。其中getString(0)后面的序号,为创建数据库表时,字段的定义顺序

  async queryUserProfile(): Promise<Array<UserProfileModel>>{try {let sql = "select * from " + UserProfileManagerUtil.USER_PROFILE_TABLE_NAMElet result = await this.storeInstance?.querySql(sql)let array: Array<UserProfileModel> = []if(result) {while(result.goToNextRow()) {let username = result.getString(0)let age = result.getLong(1)let sex = result.getLong(2)array.push(new UserProfileModel(username,age,sex));}result.close()}return array} catch (error) {Logger.error(`query failed,the cause is ${(error as BusinessError).message}`)return null}}

通过predicates.equalTo比对数据库表中数据项的主键,然后删除对应列

  deleteUserProfile(primaryKey: string){try {let predicates = new relationalStore.RdbPredicates(UserProfileManagerUtil.USER_PROFILE_TABLE_NAME) // 创建表的predicates-谓词predicates.equalTo(UserProfileManagerUtil.COL_USERNAME, primaryKey) // 匹配表中主键为key(username)的字段this.storeInstance?.delete(predicates, (err: BusinessError, rows: number) => {if (err) {Logger.error(`delete failed,the cause is ${err.message}`)return}//删除成功Logger.info(`delete successful,the rowId is ${rows}`)})} catch (error) {Logger.error(`delete failed,the cause is ${(error as BusinessError).message}`)}}

数据库的初始化

可以在UIAbility的派生类中进行数据库创建,确保到当前Context的唯一性和可行性。避免在未初始化就调用,UIAbility因此在入口处进行调用。

export default class EntryAbility extends UIAbility {async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {await UserProfileManagerUtil.getInstance().createDataBase(this.context) //创建数据库
}

这篇关于Harmony os Next——关系型数据库relationalStore.RdbStore的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024261

相关文章

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

SpringCloud使用Nacos 配置中心实现配置自动刷新功能使用

《SpringCloud使用Nacos配置中心实现配置自动刷新功能使用》SpringCloud项目中使用Nacos作为配置中心可以方便开发及运维人员随时查看配置信息,及配置共享,并且Nacos支持配... 目录前言一、Nacos中集中配置方式?二、使用步骤1.使用$Value 注解2.使用@Configur

Mac备忘录怎么导出/备份和云同步? Mac备忘录使用技巧

《Mac备忘录怎么导出/备份和云同步?Mac备忘录使用技巧》备忘录作为iOS里简单而又不可或缺的一个系统应用,上手容易,可以满足我们日常生活中各种记录的需求,今天我们就来看看Mac备忘录的导出、... 「备忘录」是 MAC 上的一款常用应用,它可以帮助我们捕捉灵感、记录待办事项或保存重要信息。为了便于在不同

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解

如何Python使用设置word的页边距

《如何Python使用设置word的页边距》在编写或处理Word文档的过程中,页边距是一个不可忽视的排版要素,本文将介绍如何使用Python设置Word文档中各个节的页边距,需要的可以参考下... 目录操作步骤代码示例页边距单位说明应用场景与高级用China编程途小结在编写或处理Word文档的过程中,页边距是一个

SpringBoot项目Web拦截器使用的多种方式

《SpringBoot项目Web拦截器使用的多种方式》在SpringBoot应用中,Web拦截器(Interceptor)是一种用于在请求处理的不同阶段执行自定义逻辑的机制,下面给大家介绍Sprin... 目录一、实现 HandlerInterceptor 接口1、创建HandlerInterceptor实