HarmonyOS —十分钟教会数据库快速上手

​​想了解更多内容,请访问:​​

​​和华为官方合作共建的鸿蒙技术社区​​

​​https://ost.​​

前言

项目需要用到数据持久化存储,没有使用过HarmonyOS数据库时,我们就需要去官方文档或其他渠道去学习怎么使用,但是官方文档等长长的文字教程通常需要自己花很长时间去学习和理解才能掌握那本可以很容易就上手的知识。本篇速成教程直接使用最精准和简短的文字,再配上讲解代码,让我们能在10分钟左右就能掌握最基本的数据库使用方法。数据库的三大要素:数据库、表、字段,接下来为大家介绍关系型数据库和对象关系数据库的使用方法。

关系型数据库

在关系型数据库中,负责对应的类或创建的方式分别为:

  1. 数据库:RdbStore
  2. 表:通过RdbStore的executeSql方法,传入对应的sql语句创建表
  3. 字段:通过RdbStore的executeSql方法,传入对应的sql语句添加字段

建表和字段

// 如果不存在表student,则创建student表,并创建“id”(自增主键)、“name”(不为空)、“age”(integer类型)、“salary”(real类型)这4个字段
rdbStore.executeSql("create table if not exists student(id integer primary key autoincrement,name text not null, age integer, salary real)");

使用RdbStore类创建数据库

根据数据库操作的辅助类DatabaseHelper创建,并传入对应的数据库配置对象、数据库版本号、数据库创建或升降级等操作的回调对象,创建RdbStore数据库对象,并在数据库创建的回调里新增对应的表和字段,如下:

// 表名称
privatestaticStringStudentTable="student";
// 数据库操作类
privateRdbStorerdbStore;
// 数据库辅助类
privateDatabaseHelperhelper;
// 根据slice创建数据库辅助类
helper=newDatabaseHelper(context);
// 初始化数据库,包括数据库的创建。
privatevoidinitDB() {
// 创建数据库配置对象
StoreConfigconfig=StoreConfig.newDefaultConfig(StudentTable+".db");
RdbOpenCallbackcallback=newRdbOpenCallback() {
@Override
publicvoidonCreate(RdbStorerdbStore) {
rdbStore.executeSql("create table if not exists student(id integer primary key autoincrement,name text not null, age integer, salary real)");
}
@Override
publicvoidonUpgrade(RdbStorerdbStore, inti, inti1) {
}
};
// 1为数据库的版本号
rdbStore=helper.getRdbStore(config,1,callback);
}

既然拿到了数据库操作类RdbStore,我们就可以对数据库进行增删改查的操作了:

新增数据操作:

// 添加数据
publicbooleaninsertStudent(Studentstudent){
ValuesBucketbucket=newValuesBucket();
bucket.putInteger("age",student.getAge());
bucket.putString("name", student.getName());
bucket.putDouble("salary", student.getSalary());
longid=rdbStore.insert(StudentTable, bucket);
returnid>0?true : false;
}

删除、修改、查询等操作,都需要配合谓词AbsRdbPredicates的子类RdbPredicates进行:

删除数据操作:

// 删除数据:删除StudentTable表中对应的id那一条数据
publicbooleandeleteStudent(Integerid){
RdbPredicatespredicates=newRdbPredicates(StudentTable);
predicates.equalTo("id", id);
intres=rdbStore.delete(predicates);
returnres>0?true : false;
}

修改数据操作:

/*
* 修改数据:修改StudentTable表中对应id的那一条数据
* 以下更新语句相当于执行了:
* update student set name=?, age=?, salary=? where id = ?
*/
publicbooleanupdateStudent(Studentstudent){
RdbPredicatespredicates=newRdbPredicates(StudentTable);
// 以下代码相当于执行了 where id = ?
predicates.equalTo("id", student.getId());
ValuesBucketbucket=newValuesBucket();
bucket.putInteger("age",student.getAge());
bucket.putString("name", student.getName());
bucket.putDouble("salary", student.getSalary());
intid=rdbStore.update(bucket, predicates);
returnid>0?true : false;
}

查询数据操作:

// 查询数据:查询StudentTable表中所有包含指定name的数据
publicList<Student>queryStudents(Stringname){
// String[]为想要查询的字段
String[] strings=newString[]{
"id", "age", "name", "salary"
};
RdbPredicatespredicates=newRdbPredicates(StudentTable);
predicates.like("name", name);
// ResultSet:查询的结果都包含在这个对象里边
ResultSetresultSet=rdbStore.query(predicates, strings);
List<Student>students=newArrayList<>();
// resultSet.goToNextRow()为true时,表示还有下一条数据,并指定到下一条数据
while (resultSet.goToNextRow()){
Studentstudent=newStudent();
student.setId(resultSet.getInt(resultSet.getColumnIndexForName("id")));
student.setAge(resultSet.getInt(resultSet.getColumnIndexForName("age")));
student.setName(resultSet.getString(resultSet.getColumnIndexForName("name")));
student.setSalary(resultSet.getDouble(resultSet.getColumnIndexForName("salary")));
students.add(student);
}
returnstudents;
}

对象型数据库

配置“build.gradle”文件:

1、如果使用注解处理器的模块为“com.huawei.ohos.hap”模块,则需要在模块的“build.gradle”文件的ohos节点中添加以下配置:

compileOptions{        
annotationEnabledtrue
}

2、如果使用注解处理器的模块为“com.huawei.ohos.library”模块,则需要在模块的“build.gradle”文件的“dependencies”节点中配置注解处理器。

查看“orm_annotations_java.jar”、“orm_annotations_processor_java.jar” 、“javapoet_java.jar”这3个jar包在HUAWEI SDK中的Sdk/java/x.x.x.xx/build-tools/lib/目录,并将目录的这三个jar包导进来。

dependencies {
compilefiles("orm_annotations_java.jar的路径", "orm_annotations_processor_java.jar的路径", "javapoet_java.jar的路径")
annotationProcessorfiles("orm_annotations_java.jar的路径", "orm_annotations_processor_java.jar的路径", "javapoet_java.jar的路径")
}

如下图所示配置:

在对象型数据库中,负责操作对应三大要素的类分别为:

数据库:被开发者用@Database注解,且继承了OrmDatabase的类,对应关系型数据库。

// 定义了一个数据库类UserStore.java,数据库包含了“User”,"Book","AllDataType"三个表,版本号为“1”。数据库类的getVersion方法和getHelper方法不需要实现,直接将数据库类设为虚类即可。
@Database(entities= {User.class, Book.class, AllDataType.class}, version=1)
publicabstractclassUserStoreextendsOrmDatabase {

}

表:被开发者用@Entity注解的实体类,且继承了OrmObject的类,对应关系型数据库中的表。

// 定义了一个实体类User.java,对应数据库内的表名为“user”;indices 为“firstName”和“lastName”两个字段建立了复合索引“name_index”,并且索引值是唯一的;“ignoredColumns”表示该字段不需要添加到“user”表的属性中。
@Entity(tableName="user", ignoredColumns= {"ignoredColumn1", "ignoredColumn2"},
indices= {@Index(value= {"firstName", "lastName"}, name="name_index", unique=true)})
publicclassUserextendsOrmObject {
// 此处将userId设为了自增的主键。注意只有在数据类型为包装类型时,自增主键才能生效。
// 注意:实体类至少要声明一个主键并实现对应的getter和setter方法,不然会编译报错!
@PrimaryKey(autoGenerate=true)
privateIntegeruserId;
privateStringfirstName;
privateStringlastName;
privateintage;
privatedoublebalance;
privateintignoredColumn1;
privateintignoredColumn2;
// 需添加各字段的getter和setter方法。
publicIntegergetUserId() {
returnuserId;
}
publicvoidsetUserId(IntegeruserId) {
this.userId=userId;
}
...
}

字段:对应实体类的属性

在HarmonyOS的对象型数据库中,有一个最重要的负责对象数据操作接口的类:OrmContext。

对象数据操作接口类OrmContext配合谓词接口OrmPredicate等,就可以实现对数据库的增删改查功能!如下为数据库的增删改查操作:

// 插入数据
publicbooleaninsertUser(Useruser){
booleanflag=ormContext.insert(user);
returnormContext.flush();
}
// 删除数据:删除User表中,对应userId的那一条数据。
publicbooleandeleteUser(IntegeruserId){
OrmPredicatespredicates=ormContext.where(User.class).equalTo("userId", userId);
intflag=ormContext.delete(predicates);
returnflag>0?true : false;
}
// 修改数据:修改User表中对应userId的那一条数据。
publicbooleanupdateUser(IntegeruserId, Useruser){

ValuesBucketbucket=newValuesBucket();
bucket.putInteger("age",user.getAge());
bucket.putString("firstName", user.getFirstName());
bucket.putString("lastName",user.getLastName());
bucket.putDouble("balance",user.getBalance());
OrmPredicatespredicates=ormContext.where(user.getClass()).equalTo("userId", userId);

introw_id=ormContext.update(predicates, bucket);
returnrow_id>0?true : false;
}
// 查询数据:查询User表中包含对应firstName的所有数据。
publicList<User>queryUsersWithFirstName(StringfirstName){
OrmPredicatespredicates=ormContext.where(User.class).like("firstName", firstName);
List<User>users=ormContext.query(predicates);
returnusers;
}

那ormContext是怎么创建出来的呢?

// 数据库名称
privateStringdatabase_name="mydb.db";
// 数据库别名
privateStringdatabase_name_alias="mydb";
DatabaseHelperhelper=newDatabaseHelper(context);
// UserStore.class:数据库类
ormContext=helper.getOrmContext(database_name_alias, database_name, UserStore.class);

DatabaseHelper是数据库操作的辅助类,当数据库创建成功后,数据库文件将存储在由上下文指定的目录里。注意:context入参类型为ohos.app.Context,注意不要使用slice.getContext()来获取context,请直接传入slice,否则会出现找不到类的报错。

总结

此文章用较小的篇幅讲解了最基本的HarmonyOS中关系型数据库和对象型数据库的使用,使读者能够快速理解和上手相关的知识和操作,当读者上手了这篇文章时,再去看其他更全更深层次的知识,相信会更加容易读懂和上手。

​​想了解更多内容,请访问:​​

​​和华为官方合作共建的鸿蒙技术社区​​

​​https://ost.​​

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/271466.html<

(0)
运维的头像运维
上一篇2025-05-08 07:19
下一篇 2025-05-08 07:20

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注