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

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

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