当前位置: 首页 > 科技观察

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

时间:2023-03-11 22:07:58 科技观察

前言该项目需要使用持久化数据存储。当我们还没有使用过HarmonyOS数据库的时候,我们需要去官方文档或者其他渠道去学习如何使用。然而,官方文档等长文本教程通常需要很长时间才能学习和理解。以掌握容易学习的知识。本速成班直接用最准确最简短的文字,配上讲解代码,让我们在10分钟左右的时间内掌握最基本的数据库使用方法。数据库的三大要素:数据库、表、字段,然后介绍关系型数据库和对象-关系型数据库的使用。关系型数据库在关系型数据库中,对应的类或创建方法为:数据库:RdbStore表:通过RdbStore的executeSql方法传入对应的sql语句创建表字段:通过RdbStore的executeSql方法传入对应的表字段的sqlstatement添加字段建表和字段//如果student表不存在,则创建student表,并创建"id"(自增主键)、"name"(不为空)、"age"(整数类型)),"salary"(realtype)这4个字段rdbStore.executeSql("createtableifnotexistsstudent(idintegerprimarykeyautoincrement,nametextnotnull,ageinteger,salaryreal)");使用RdbStore类创建数据库根据数据库创建操作的辅助类DatabaseHelper,并传入相应的数据库配置对象,数据库版本号,数据库创建或降级操作的回调对象,创建RdbStore数据库对象,以及在创建数据库的回调中添加相应的表和字段,如下://表名privatestaticStringStudentTable="student";//数据库操作类privateRdbStorerdbStore;//数据库辅助类privateDatabaseHelperhelper;//创建数据库根据slice=newDatabaseHelper(context)的辅助类助手;//初始化数据库,包括数据库的创建。privatevoidinitDB(){//创建数据库配置对象StoreConfigconfig=StoreConfig.newDefaultConfig(StudentTable+".db");RdbOpenCallbackcallback=newRdbOpenCallback(){@OverridepublicvoidonCreate(RdbStorerdbStore){rdbStore.executeSql("如果学生不存在则创建表(idintegerprimarykeyautoincrement,nametextnotnull,ageinteger,salaryreal)");}@OverridepublicvoidonUpgrade(RdbStorerdbStore,inti,inti1){}};//1是数据库的版本号rdbStore=helper.getRdbStore(config,1,callback);}现在我们已经获取了数据库操作类RdbStore,接下来我们可以对数据库进行增删改查:新增数据操作://添加数据publicbooleaninsertStudent(Studentstudent){ValuesBucketbucket=newValuesBucket();bucket.putInteger("年龄",student.getAge());bucket.putString("姓名",student.getName());bucket.putDouble("工资",student.getSalary());longid=rdbStore.insert(StudentTable,bucket);返回id>0?true:false;}删除、修改、查询等操作需要配置结合谓词AbsRdbPredicates的子类RdbPredicates执行:删除数据操作://删除数据:删除StudentTable表中id对应的数据publicbooleandeleteStudent(Integerid){RdbPredicatespredicates=newRdbPredicates(StudentTable);predicates.equalTo("id",id);intres=rdbStore.delete(谓词);返回res>0?true:false;}修改数据操作:/**修改数据:修改StudentTable表中id对应的数据*下面的更新语句相当于执行:*updatestudentsetname=?,age=?,salary=?id=在哪里?*/publicbooleanupdateStudent(Studentstudent){RdbPredicates谓词=newRdbPredicates(StudentTable);//下面的代码相当于执行whereid=?predicates.equalTo("id",student.getId());ValuesBucketbucket=newValuesBucket();bucket.putInteger("年龄",student.getAge());bucket.putString("姓名",student.getName());bucket.putDouble("工资",student.getSalary());intid=rdbStore.update(bucket,谓词);返回id>0?true:false;}查询数据操作://查询数据:查询StudentTable表中所有包含指定名字的数据publicListqueryStudents(Stringname){//String[]是你要查询的字段String[]strings=newString[]{"id","age","name","salary"};RdbPredicates谓词=newRdbPredicates(StudentTable);predicates.like("名字",名字);//ResultSet:查询的结果包含在这个对象中ResultSetresultSet=rdbStore.query(predicates,strings);Liststudents=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(学生);}returnstudents;}对象数据库配置“build.gradle”文件:1.如果使用注解处理器模块为“com.huawei.ohos.hap"模块,需要在模块的"build.gradle"文件的ohos节点中添加如下配置:compileOptions{annotationEnabledtrue}2.如果使用注解处理器的模块是"com.huawei.ohos.library"模块,需要在模块的“build.gradle”文件的“dependencies”节点配置注解处理器,查看HUAWEISDK中的Sdk/java有“orm_annotations_java.jar”、“orm_annotations_processor_java.jar”三个jar包,和"javapoet_java.jar"./x.x.x.xx/build-tools/lib/目录,并导入目录下的三个jar包。"pathofjavapoet_java.jarpath")annotationProcessorfiles("pathoform_annotations_java.jar","pathoform_annotations_processor_java.jar","pathofjavapoet_java.jar")}配置如下图:对象数据库中,它负责操作相应的三个elements类有:Database:由开发者用@Database注解,继承OrmDatabase类,对应关系型数据库。//定义了一个数据库类UserStore.java,该数据库包含“User”、“Book”、“AllDataType”三个表,版本号为“1”。数据库类的getVersion方法和getHelper方法不需要实现,直接将数据库类设置为虚类即可。@Database(entities={User.class,Book.class,AllDataType.class},version=1)publicabstractclassUserStoreextendsOrmDatabase{}table:开发者用@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为自增主键。注意自增主键只有在数据类型为wrapper类型时才能生效。//注意:实体类必须至少声明一个主键并实现相应的getter和setter方法,否则会编译报错!@PrimaryKey(autoGenerate=true)privateIntegeruserId;私有字符串名字;私有字符串姓氏;私人年龄;私人双平衡;privateintignoredColumn1;privateintignoredColumn2;//需要为每个字段添加getter和setter方法。publicIntegergetUserId(){返回userId;}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(谓词);返回标志>0?true:false;}//修改数据:修改User表中userId对应的那条数据。publicbooleanupdateUser(IntegeruserId,Useruser){ValuesBucketbucket=newValuesBucket();bucket.putInteger("年龄",user.getAge());bucket.putString("firstName",user.getFirstName());bucket.putString("lastName",user.getLastName());bucket.putDouble("余额",user.getBalance());OrmPredicates谓词=ormContext.where(user.getClass()).equalTo("userId",userId);introw_id=ormContext.update(predicates,bucket);返回row_id>0?true:false;}//查询数据:查询用户表中包含对应firstName的所有数据。publicListqueryUsersWithFirstName(StringfirstName){OrmPredicatespredicates=ormContext.where(User.class).like("firstName",firstName);Listusers=ormContext.query(predicates);returnusers;}那ormContext是如何创建的?//数据库名称privateStringdatabase_name="mydb.db";//数据库别名privateStringdatabase_name_alias="mydb";DatabaseHelperhelper=newDatabaseHelper(context);//UserStore.class:数据库类ormContext=helper.getOrmContext(database_name_alias,数据库名,UserStore.class);DatabaseHelper是数据库操作的辅助类。当数据库创建成功后,数据库文件会存放在上下文指定的目录下。注意:context的入参类型为ohos.app.Context,注意不要使用slice.getContext()获取context,请直接传入slice,否则会出现找不到类的错误。小结本文用小篇幅讲解HarmonyOS中最基本的关系型数据库和对象型数据库的使用,让读者快速了解并上手相关知识和操作。当读者上手本文后,再阅读其他更完整、更深入的知识,相信阅读和使用起来会更轻松。更多信息请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com