2024年HarmonyOS鸿蒙最全鸿蒙开发实例|对象关系映射数据库_@ohos(2),2024年最新面试建议

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

图1 对象关系映射数据库的运作机制

创建Phone设备下的Java模板新项目。在进行开发之前,首先要进行build.gradle文件的配置,否则无法识别相关数据库的类的包。

一般情况下,使用的注解处理器的模块为com.huawei.ohos.hap模块,需要在模块的build.gradle文件的ohos节点中添加以下配置,代码如下:

compileOptions{
    annotationEnabled true    
}

如果使用注解处理器的模块为com.huawei.ohos.library,则需要在模块的build.gradle文件dependencies节点中配置注解处理器,此外,还需要在本地的HUAWEI SDK中找到orm_annotations_java.jar、orm_annotations_processor_java.jar和javapoet_java.jar这3个jar包的对应目录,并将这3个jar包的路径导入,代码如下:

dependencies {
    compile files("orm_annotations_java.jar的路径","orm_annotations_processor_java.jar的路径","javapoet_java.jar的路径")
    annotationProcessor files("orm_annotations_java.jar的路径","orm_annotations_processor_java.jar的路径","javapoet_java.jar的路径")
}

如果使用注解处理器的模块为java-library,则还需要导入ohos.jar的路径,具体代码如下:

dependencies {
    compile files("ohos.jar的路径","orm_annotations_java.jar的路径","orm_annotations_processor_java.jar的路径","javapoet_java.jar的路径")
    annotationProcessor files("orm_annotations_java.jar的路径","orm_annotations_processor_java.jar的路径","javapoet_java.jar的路径")
}

配置完成之后,就可以开始新建数据库并对其进行操作了,具体步骤如下。

01、新建数据库及属性配置

创建数据库时,首先需要定义一个表示数据库的类,继承OrmDatabase,再通过@Database注解内的entities属性指定哪些数据模型类属于这个数据库,version属性指明数据库版本号。

在本例中,首先新建一个数据库类BookStore.java,选择entry→src→main→com.huawei.ormdb,右击选择并新建Class,命名为BookStore,如图2所示。

图2 新建一个数据库类

数据库类BookStore.java包含了User和Book两个表,版本号为1,将数据库类设置为虚类。具体代码如下:

import ohos.data.orm.OrmDatabase;
import ohos.data.orm.annotation.Database;

@Database(entities = {User.class, Book.class}, version = 1)
public abstract  class BookStore extends OrmDatabase {
}

02、构造数据表

构造数据表,即创建数据库实体类并配置对应的属性(如对应表的主键、外键等)。可通过创建一个继承了OrmObject并用@Entity注解的类,获取数据库实体对象,也就是表的对象。需要注意的是,数据表必须与其所在的数据库在同一个模块中。以新建的User表为例,新建的User类与BookStore类位于同一模块下,相应的目录如图3所示。

图3 BookStore数据库与User表位于同一模块

具体的构建过程代码如下:

//新建User表
import ohos.data.orm.OrmObject;
import ohos.data.orm.annotation.Entity;
import ohos.data.orm.annotation.Index;
import ohos.data.orm.annotation.PrimaryKey;
@Entity(tableName = "user", ignoredColumns = {"ignoreColumn1", "ignoreColumn2"},
indices = {@Index(value = {"firstName", "lastName"}, name = "name_index", unique = true)})
public class User extends OrmObject {
    //此处将userId设为了自增的主键。注意只有在数据类型为包装类型时,自增主键才能生效。
    @PrimaryKey(autoGenerate = true)
    private Integer userId;
    private String firstName;
    private String lastName;
    private int age;
    private double balance;
    private int ignoreColumn1;
    private int ignoreColumn2;

    //设置字段的getter和setter方法,此处仅给出示例,读者可以根据所设置的属性自行补全方法
    public void setBalance(double balance) {
        this.balance = balance;
    }

   ...

    public Integer getUserId() {
        return userId;
    }

   ...
}

在新建的User类中进行属性配置,tableName = "user"即在对应数据库内的表名为user,indices为属性列表,@Index注解的内容对应数据表索引的属性,本例中indices为firstName和lastName两个字段建立了复合索引,索引名为name_index,并且索引值是唯一的。ignoreColumns 表示该字段不需要添加到user 表的属性中,即类中定义的ignoreColumn1和ignoreColumn2不属于user表的属性。被@PrimaryKey注解的变量对应数据表的主键,一个表里只能有一个主键,在本例的user表中,将userId设为自增的主键。

数据库内还包含了Book表,Book表的构建和对其操作的实现过程同User表相同,具此处不再赘述其体实现。

03、创建数据库

在MainAbilitySlice的onStart()方法中完成数据库的创建,使用对象数据操作接口OrmContext创建数据库,实现代码如下:

public void onStart(Intent intent) {
   super.onStart(intent);
   super.setUIContent(ResourceTable.Layout_ability_main);

//使用对象数据操作接口OrmContext创建数据库
   DatabaseHelper helper = new DatabaseHelper(this);
   OrmContext context = helper.getOrmContext("BookStore", "BookStore.db", BookStore.class);

//对数据库进行操作
   //增加数据
     ...

   //查询数据
     ...

   //修改数据
     ...

   //删除数据
     ...
}

与构建关系型数据库不同的是,此处new DatabaseHelper(context)方法中context的入参类型为ohos.app.Context,必须直接传入slice而不能使用slice.getContext()获取context,否则会出现找不到类的报错。到这里,就成功创建了一个别名为BookStore且数据库文件名为BookStore.db的数据库。如果数据库已经存在,则执行上述代码并不会重复建库。通过context.getDatabaseDir()可以获取创建的数据库文件所在的目录。

04、数据操作

对象数据操作接口OrmContext提供了对数据库进行增、删、改、查的一系列方法,接下来进行详细介绍。

(1)增加数据 。

例如,在名为user 的表中,新建一个User 对象并设置其属性。OrmContext提供insert()方法将对象插入数据库。执行完insert()方法后,数据被保存在内存中,只有在flush()被调用后才会将数据持久化到数据库中。以HiLog形式显示插入数据后的user表,如图4所示。此处涉及对数据库的查询操作,将在稍后进行详细讲解。具体代码如下:

//增加数据

//新建User对象
User user = new User();
//设置对象属性
user.setUserId(0);
user.setFirstName("aa");
user.setLastName("AA");
user.setAge(22);
user.setBalance(120.51);

//再新建两个User对象,设置属性后将其持久化到数据库中,此处读者可以自行添加代码
...
//将新建对象插入并持久化到数据库中
boolean isSuccessed = context.insert(user);
isSuccessed = context.flush();

//以HiLog形式显示新增数据后的user表,以userID升序显示
HiLogLabel logLabel = new HiLogLabel(HiLog.LOG_APP,0,"OrmDB");
String s = new String("userID");
s = s.concat(" firstName");
s = s.concat(" lastName");
s = s.concat(" age");
s = s.concat(" balance");
HiLog.fatal(logLabel,"显示插入数据后的user表:");
HiLog.fatal(logLabel,s);

//查询数据
OrmPredicates query = context.where(User.class).orderByAsc("userID");
List<User> users = context.query(query);
int i = 0;
while (i != users.size()) {
            int id = users.get(i).getUserId();
            String s1 = "\t" + id + "\t\t";
            s1 = s1.concat(users.get(i).getFirstName() + "\t");
            s1 = s1.concat("\t\t" + users.get(i).getLastName());
            s1 = s1.concat("\t " + users.get(i).getAge() + "\t");
            s1 = s1.concat(" " + users.get(i).getBalance());
            HiLog.fatal(logLabel, s1);
            i = i + 1;
}

(2) 查询数据。

OrmContext提供query()方法查询满足指定条件的对象实例。例如,在user表中查询age=22的对象,在查询之前,依旧需要先设置谓词query1,利用query()方法查找user表中满足query1 的数据,得到一个User的列表user1,遍历user1,获取user1中各个对象的属性值,实现代码如下:

//查询age=22的数据并显示

//设置谓词
OrmPredicates query1 = context.where(User.class).equalTo("age", "22");
//查询
List<User> users1 = context.query(query1);

//将查询结果以HiLog形式显示
HiLogLabel logLabel1 = new HiLogLabel(HiLog.LOG_APP,0,"OrmDB");
HiLog.fatal(logLabel1,"显示user表中age值为22的数据:");


![img](https://img-blog.csdnimg.cn/img_convert/1c77c9c30ceaa199adb7dd2f59853e47.png)
![img](https://img-blog.csdnimg.cn/img_convert/9e048a571c9f3916673491d31362a403.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

wH-1715625758012)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值