ORM数据库主要由数据库、实体对象、对象数据操作接口三个组件组成;通过谓词访问到应用持久化的关系型数据。通过将实例对象映射到关系上,实现操作实例对象的语法,来操作关系型数据库。它是在SQLite数据库的基础上提供的一个抽象层。主要运作机制如下图:
ORM数据库由数据库的类,和数据表的类构成,并且在创建之前要添加相关jar包才能使用。
添加相关jar包
//添加以下代码 开启注解
compileOptions{
annotationEnabled true
}
//ohos节点完整代码
ohos {
compileSdkVersion 5
defaultConfig {
compatibleSdkVersion 4
}
buildTypes {
release {
proguardOpt {
proguardEnabled false
rulesFiles 'proguard-rules.pro'
}
}
}
//开启注解
compileOptions{
annotationEnabled true
}
}
添加完成后配置如下:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
testImplementation 'junit:junit:4.13'
ohosTestImplementation 'com.huawei.ohos.testkit:runner:1.0.0.100'
compile files("E:\\Program Files\\Huawei\\sdk\\java\\2.1.1.21\\api\\ohos.jar",
"E:\\Program Files\\Huawei\\sdk\\java\\2.1.1.21\\build-tools\\lib\\orm_annotations_java.jar",
"E:\\Program Files\\Huawei\\sdk\\java\\2.1.1.21\\build-tools\\lib\\orm_annotations_processor_java.jar",
"E:\\Program Files\\Huawei\\sdk\\java\\2.1.1.21\\build-tools\\lib\\javapoet_java.jar")
annotationProcessor files("E:\\Program Files\\Huawei\\sdk\\java\\2.1.1.21\\build-tools\\lib\\orm_annotations_java.jar",
"E:\\Program Files\\Huawei\\sdk\\java\\2.1.1.21\\build-tools\\lib\\orm_annotations_processor_java.jar",
数据库创建前配置完成后,就可以使用orm数据库了。
ORM数据库里面数据库类代表的就是数据库,要继承OrmDatabase,并使用@DataBase注解。
/**
* 创建数据库类
* entities 数据库里面的表对应的java类,可以是多个
* StudentTable.class 学生表
*
* version 数据库版本
* */
@Database(entities = {StudentTable.class},version = 1)
public abstract class SchoolDataBase extends OrmDatabase {
}
ORM数据量里面数据库类代表数据库里面的数据库,要继承OrmObject,并使用@Entity注解。
/**
* tablename 表明
* indice 索引 @Index(value = {"firstTime","lastTime"} firstTime 和 lastTime组合起来不能重复
* unique = true 索引唯一
* time_index 索引名称
* */
@Entity(tableName = "student",indices = {@Index(value = {"firstTime","lastTime"},name = "time_index",unique = true)})
public class StudentTable extends OrmObject {
@PrimaryKey(autoGenerate = true)
private int studentId;
private String studentName;
private String firstTime;
private String lastTime;
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getFirstTime() {
return firstTime;
}
public void setFirstTime(String firstTime) {
this.firstTime = firstTime;
}
public String getLastTime() {
return lastTime;
}
public void setLastTime(String lastTime) {
this.lastTime = lastTime;
}
}
通过DatabaseHelper的getOrmContext来创建ORM数据库,三个参数分别是数据库别名、数据库文件、对应的代表数据库类的java类。
//在配置和数据库类 数据库表都完成了
//创建数据库和表
DatabaseHelper helper = new DatabaseHelper(this);
//数据库的别名
//数据库类
helper.getOrmContext("SchoolDataBase","SchoolDataBase.db", SchoolDataBase.class);
通过以上步骤就可以创建ORM数据库了,并且数据库里面有一张Student的数据表。
数据库的增删改查可以通过以下API进行实现,通过操作对象数据接口,实现增删改查的功能。
ORM数据库通过对象的直接插入新增数据,不用编写sql语句。
OrmContext schoolDataBase = helper.getOrmContext("SchoolDataBase", "SchoolDataBase.db", SchoolDataBase.class);
//数据的新增
StudentTable tableInsert = new StudentTable();
tableInsert.setStudentName("李四");
tableInsert.setFirstTime("2014-9-10");
tableInsert.setLastTime("2018-7-6");
//insert 插入结果 true成功 false失败
//这里的数据是插入到内存中,并没有真正的把数据库落地到仓库
boolean insert = schoolDataBase.insert(tableInsert);
boolean isFlush = schoolDataBase.flush();//将数据真正落地到仓库
只有当两个boolean都为true的时候,才说明数据已经插入到数据库里面去了,这里看一下控制台的结果。
ORM数据库通过调用query进行查询,传入对应的谓词对象,或者谓词对象和指定返回字段的string数组。
/**
* 查询数据表StudentTable
* 里面firstTime等于2014 lastTime等于2018-7-6的数据
* */
OrmPredicates ormPredicates = schoolDataBase.where(StudentTable.class).equalTo("firstTime", "2014-9-10").and().equalTo("lastTime", "2018-7-6");
//只传谓词得到的是一个List集合
List<StudentTable> query = schoolDataBase.query(ormPredicates);
//循环打印数据
query.forEach(studentTable -> {
HiLog.info(logLabel,studentTable.getStudentName());
});
//传入谓词和string数组(指定返回字段),得到的是一个结果集
ResultSet query1 = schoolDataBase.query(ormPredicates, new String[]{"id", "studentName"});//指定返回的字段
HiLog.info(logLabel, Arrays.toString(query1.getAllColumnNames()));
OrmPredicates ormPredicates = schoolDataBase.where(StudentTable.class).equalTo("firstTime", "2014-9-10").and().equalTo("lastTime", "2018-7-6");
//只传谓词得到的是一个List数组
List<StudentTable> query = schoolDataBase.query(ormPredicates);
修改数据:
StudentTable table = query.get(0);
table.setStudentName("改李四");
调用update API进行修改,并查询输出新数据:
//这里的boolean只是修改了内存
boolean update = schoolDataBase.update(table);
//通过flush修改数据库里面的数据
boolean flush = schoolDataBase.flush();
HiLog.info(logLabel,"update:" + update + " --:" + flush);
List<StudentTable> query2 = schoolDataBase.query(ormPredicates);
query2.forEach(studentTable -> {
HiLog.info(logLabel,"update:"+studentTable.getStudentName());
});
OrmPredicates ormUpdate = schoolDataBase.where(StudentTable.class).equalTo("studentName", "李四");
创建修改的值的封装类(将studentName修改为二改李四):
ValuesBucket bucket = new ValuesBucket();
bucket.putString("studentName","二改李四");
修改查询并在控制台输出结果:
//这里直接调用update方法,不需要额外调用flush就可以达到直接修改数据库里面数据的效果。
schoolDataBase.update(ormUpdate,bucket);
List<StudentTable> query2 = schoolDataBase.query(ormPredicates);
query2.forEach(studentTable -> {
HiLog.info(logLabel,"update:"+studentTable.getStudentName());
});
StudentTable tableDelete = query.get(0);
boolean delete = schoolDataBase.delete(tableDelete);
boolean flush = schoolDataBase.flush();
OrmPredicates ormPredicatesDelete = schoolDataBase.where(StudentTable.class).equalTo("studentName", "李四");
int delete = schoolDataBase.delete(ormPredicatesDelete);
对象关系型数据库提供事务机制,来保证用户操作的原子性。对单条数据进行数据库操作时,无需开启事务;插入大量数据时,开启事务可以保证数据的准确性。如果中途操作出现失败,会自动执行回滚操作。
ORM事务有以下四个主要API:
OrmContext支持标准的事务处理,通过一段简短的代码来看
对数据库的每一次操作,比如增删改查,都是一个单独的事务互不影响,而某些时候需要执行一些特定的操作,比如我要添加新数据,然后删除老数据,就需要让这两个处于通一个事务下执行;看以下例子代码:
schoolDataBase.beginTransaction();
try {
//添加
StudentTable tableInsert2 = new StudentTable();
tableInsert2.setStudentName("王五");
tableInsert2.setFirstTime("2014-9-10");
tableInsert2.setLastTime("2018-7-6");
schoolDataBase.insert(tableInsert2);
schoolDataBase.flush();
double c = 1/0;//被除数不能为0 这里会出现异常
//删除
OrmPredicates ormPredicatesDelete = schoolDataBase.where(StudentTable.class).equalTo("studentName", "李四");
int delete = schoolDataBase.delete(ormPredicatesDelete);
schoolDataBase.commit();
}catch (Exception e){
e.printStackTrace();
//出现异常,数据回滚
schoolDataBase.rollback();
}
通过使用对象数据操作接口,开发者可以在某些数据上设置观察者,接收数据变化的通知。
同样通过OrmContext提供的API来实现:
观察者只能监听观察到调用了flush的事务,没有调用flush的事务无法监听。
创建观察者:
public class OrmObjectObserver implements ohos.data.orm.OrmObjectObserver {
/**
* @param ormContext 数据库资源句柄
* @param allChangeToTarget 操作工具类
* */
@Override
public void onChange(OrmContext ormContext, AllChangeToTarget allChangeToTarget) {
//针对业务逻辑,做出符合业务逻辑的操作
//ormContext可以执行数据库的操作
//通过ormContext可以拿到最新添加到数据库里面记录的对应的student对象
// //可以通过工具类将数据保存到对应list里面去
// allChangeToTarget.addToDeletedList();
// allChangeToTarget.addToInsertList();
// allChangeToTarget.addToUpdatedList();
// //可以通过工具类将保存的数据取出
// allChangeToTarget.getDeletedList();
// allChangeToTarget.getInsertedList();
// allChangeToTarget.getUpdatedList();
}
}
给数据库添加注册观察者:
//注册观察者
//student 要观察的表
//OrmObjectObserver 回调
schoolDataBase.registerEntityObserver("student",new OrmObjectObserver());
开发者可以将当前数据库的数据进行备份,在必要的时候进行数据恢复。
数据库的备份和还原比较简单,在拿到ormContext之后调用相关API进行操作。
//SchoolDataBaseBack.db 备份的数据库名称
schoolDataBase.backup("SchoolDataBaseBack.db");
//SchoolDataBaseBack.db 将哪个数据库的数据进行还原
schoolDataBase.restore("SchoolDataBaseBack.db");
在删除数据库之前要先关闭数据库,然后通过DataBaseHelper的删除api进行删除。
schoolDataBase.close();//先关掉
helper.deleteRdbStore("SchoolDataBase.db");//再删除
以上就是ORM数据库的相关操作。