HarmonyOS 數(shù)據(jù)庫系列之對象關(guān)系映射數(shù)據(jù)庫
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
前言
鴻蒙提供了非常強(qiáng)大的數(shù)據(jù)庫操作功能, 前面講到了 關(guān)系型數(shù)據(jù)庫, 是基于關(guān)系模型來管理數(shù)據(jù)的數(shù)據(jù)庫。
其實鴻蒙還有一種 體驗更好,操作更方便的數(shù)據(jù)庫 ,對象關(guān)系映射數(shù)據(jù)庫, 這種數(shù)據(jù)庫的好處是 直接基于sqlite數(shù)據(jù)庫架構(gòu)的, 操作sql語句的操作更簡單,可以直接配置進(jìn)行。
其實這種配置更像做web后臺系統(tǒng)的開發(fā),一個類就是一個表,如果需要添加信息直接更新實體類就行。
簡介
先了解一下概念,概念是一切功能的使用總結(jié)。
HarmonyOS對象關(guān)系映射(Object Relational Mapping,ORM)數(shù)據(jù)庫是一款基于SQLite的數(shù)據(jù)庫框架,屏蔽了底層SQLite數(shù)據(jù)庫的SQL操作,針對實體和關(guān)系提供了增刪改查等一系列的面向?qū)ο蠼涌凇?yīng)用開發(fā)者不必再去編寫復(fù)雜的SQL語句, 以操作對象的形式來操作數(shù)據(jù)庫,提升效率的同時也能聚焦于業(yè)務(wù)開發(fā)。
在我看來 對象關(guān)系映射數(shù)據(jù)庫非常重要的 三個 組件:
- 數(shù)據(jù)庫:被開發(fā)者用@Database注解,且繼承了OrmDatabase的類,對應(yīng)關(guān)系型數(shù)據(jù)庫。
- 實體對象:被開發(fā)者用@Entity注解,且繼承了OrmObject的類,對應(yīng)關(guān)系型數(shù)據(jù)庫中的表。
- 對象數(shù)據(jù)操作接口:包括數(shù)據(jù)庫操作的入口OrmContext類和謂詞接口(OrmPredicate)。
肯定還有更多的其它方面,以后繼續(xù)補(bǔ)充吧。
運作機(jī)制
運作機(jī)制 我查看了一下官網(wǎng)的說明, 說了一大堆。其實主要的還是對 關(guān)系型數(shù)據(jù)庫的擴(kuò)展:
對象關(guān)系映射數(shù)據(jù)庫操作是基于關(guān)系型數(shù)據(jù)庫操作接口完成的,實際是在關(guān)系型數(shù)據(jù)庫操作的基礎(chǔ)上又實現(xiàn)了對象關(guān)系映射等特性。
全部介紹如下:
- 對象關(guān)系映射數(shù)據(jù)庫操作是基于關(guān)系型數(shù)據(jù)庫操作接口完成的,實際是在關(guān)系型數(shù)據(jù)庫操作的基礎(chǔ)上又實現(xiàn)了對象關(guān)系映射等特性。因此對象關(guān)系映射數(shù)據(jù)庫跟關(guān)系型數(shù)據(jù)庫一樣,都使用SQLite作為持久化引擎,底層使用的是同一套數(shù)據(jù)庫連接池和數(shù)據(jù)庫連接機(jī)制。
- 使用對象關(guān)系映射數(shù)據(jù)庫的開發(fā)者需要先配置實體模型與關(guān)系映射文件。應(yīng)用數(shù)據(jù)管理框架提供的類生成工具會解析這些文件,生成數(shù)據(jù)庫幫助類,這樣應(yīng)用數(shù)據(jù)管理框架就能在運行時,根據(jù)開發(fā)者的配置創(chuàng)建好數(shù)據(jù)庫,并在存儲過程中自動完成對象關(guān)系映射。開發(fā)者再通過對象數(shù)據(jù)操作接口,如OrmContext接口和謂詞接口等操作持久化數(shù)據(jù)庫。
- 對象數(shù)據(jù)操作接口提供一組基于對象映射的數(shù)據(jù)操作接口,實現(xiàn)了基于SQL的關(guān)系模型數(shù)據(jù)到對象的映射,讓用戶不需要再和復(fù)雜的 SQL語句打交道,只需簡單地操作實體對象的屬性和方法。對象數(shù)據(jù)操作接口支持對象的增刪改查操作,同時支持事務(wù)操作等。
對象關(guān)系映射數(shù)據(jù)庫運作機(jī)制:

從上圖運行機(jī)制可以看出,對象關(guān)系型數(shù)據(jù)庫 是在關(guān)系型數(shù)據(jù)庫基礎(chǔ)上做了 一部分?jǐn)U展, 就是將數(shù)據(jù)庫的 庫和表的創(chuàng)建 給簡化了,不需要我們自己去做添加了,配置就行。
這也是數(shù)據(jù)庫的一種很好的擴(kuò)展,讓開發(fā)更簡單方便。
創(chuàng)建數(shù)據(jù)庫及其表
數(shù)據(jù)庫的創(chuàng)建可以根據(jù)自己需求,如果 在項目啟動就需要創(chuàng)建數(shù)據(jù)庫,建議在 application中執(zhí)行啟動操作。
這里我們 在 每一個 ability中 的 onStart 函數(shù)中執(zhí)行如下創(chuàng)建操作:
- DatabaseHelper helper = new DatabaseHelper(this);
- OrmContext connect = helper.getOrmContext("UserDatabase", "UserDatabase.db", UserDatabase.class);
getOrmContext 參數(shù)說明 :
1、別名
2、數(shù)據(jù)庫名
3、對象-對應(yīng)關(guān)系型數(shù)據(jù)庫。
還有一點 需要注意,最后的參數(shù)就是表的創(chuàng)建,如果要創(chuàng)建多張表,可以添加多個 實體類。
來看看如下的 對象關(guān)系:
- package com.hadiidbouk.databasemanager.database.object;
- import ohos.data.orm.OrmDatabase;
- import ohos.data.orm.annotation.Database;
- /**
- * Database
- */
- @Database(
- entities = {User.class},
- version = 1)
- public abstract class UserDatabase extends OrmDatabase { }
@Database注解,繼承了OrmDatabase的類,對應(yīng)關(guān)系型數(shù)據(jù)庫。
數(shù)據(jù)對象:
每一個數(shù)據(jù)對象就是一個表,字段信息可以根據(jù)需求更新變化。
- /**
- * user Table
- */
- @Entity(tableName = "user")
- public class User extends OrmObject {
- @PrimaryKey()
- private Long formId;
- private String formName;
- private Integer dimension;
- public User(Long formId, String formName, Integer dimension) {
- this.formId = formId;
- this.formName = formName;
- this.dimension = dimension;
- }
- public User() { }
- public Integer getDimension() {
- return dimension;
- }
- public void setDimension(Integer dimension) {
- this.dimension = dimension;
- }
- public Long getFormId() {
- return formId;
- }
- public void setFormId(Long formId) {
- this.formId = formId;
- }
- public String getFormName() {
- return formName;
- }
- public void setFormName(String formName) {
- this.formName = formName;
- }
- }
用@Entity注解,且繼承了OrmObject的類,對應(yīng)關(guān)系型數(shù)據(jù)庫中的表。
數(shù)據(jù)庫使用
在使用數(shù)據(jù)庫之前最好是整理一個 工具類,所有的操作都放在工具類中,這樣調(diào)用和擴(kuò)展都方便了。
我就對數(shù)據(jù)庫的有關(guān)操作 做了一個封裝,目前也是比較簡單的,只是做了增,刪,改,查等操作。
關(guān)系對象型數(shù)據(jù)庫的操作工具類:
- /**
- * Database Operations
- *
- * @since 2021-06-23
- */
- public class DatabaseUtils {
- /**
- * add card info
- *
- * @param form card object
- * @param connect data connection
- */
- public static void insertForm(User form, OrmContext connect) {
- connect.insert(form);
- connect.flush();
- }
- /**
- * query database
- *
- * @param connect data connection
- * @return database
- */
- public static List<User> queryForm(OrmContext connect){
- // 從數(shù)據(jù)庫中獲取信息
- OrmPredicates ormPredicates = new OrmPredicates(User.class);// 搜索實例
- List<User> formList = connect.query(ormPredicates);
- if (formList.size() <= 0) {
- return formList;
- }
- for (User form : formList) {
- // 遍歷
- System.out.println("FormId = "+form.getFormId()+" = FormName"+form.getFormName()+" = Dimension"+form.getDimension());
- }
- return formList;
- }
- /**
- * update database
- *
- * @param connect 數(shù)據(jù)庫實體
- * @param user user
- */
- public static void updateForms(OrmContext connect,User user) {
- // 從數(shù)據(jù)庫中獲取信息
- ValuesBucket valuesBucket = new ValuesBucket();
- valuesBucket.putString("formName", user.getFormName());
- valuesBucket.putInteger("dimension", user.getDimension());
- OrmPredicates update = connect.where(User.class).equalTo("formId", user.getFormId());
- connect.update(update, valuesBucket);
- }
- /**
- * delete data
- *
- * @param formId form id
- * @param connect data connection
- */
- public static void deleteFormData(long formId, OrmContext connect) {
- OrmPredicates where = connect.where(User.class);
- where.equalTo("formId", formId); // 在數(shù)據(jù)庫的“user”表中查詢formId為“”的User對象列表
- List<User> query = connect.query(where);
- if (!query.isEmpty()) {
- connect.delete(query.get(0));
- connect.flush();
- }
- }
- }
1、數(shù)據(jù)庫操作的入口OrmContext類 ,進(jìn)行數(shù)據(jù)庫操作
2、謂詞接口(OrmPredicate),進(jìn)行實例的制定(例如:條件查詢,條件刪除)
3、ValuesBucket 實例
操作使用:
創(chuàng)建一個 ability,該類是需求操作界面類。
- public class DatabaseObjectAbility extends Ability implements Component.ClickedListener {
- private DatabaseHelper helper = new DatabaseHelper(this);
- private OrmContext connect;
- @Override
- public void onStart(Intent intent) {
- super.onStart(intent);
- super.setUIContent(ResourceTable.Layout_ability_database_object);
- connect = helper.getOrmContext("UserDatabase", "UserDatabase.db", UserDatabase.class);
- findComponentById(ResourceTable.Id_xinzeng_db).setClickedListener(this);
- findComponentById(ResourceTable.Id_chaxun_db).setClickedListener(this);
- findComponentById(ResourceTable.Id_xiugai_db).setClickedListener(this);
- findComponentById(ResourceTable.Id_shagnchu_db).setClickedListener(this);
- }
- @Override
- public void onClick(Component component) {
- switch (component.getId()){
- case ResourceTable.Id_xinzeng_db:
- insertDB();
- break;
- case ResourceTable.Id_chaxun_db:
- DatabaseUtils.queryForm(connect);
- break;
- case ResourceTable.Id_xiugai_db:
- User form = new User(100l, "陳建朋", 101);
- DatabaseUtils.updateForms(connect,form);
- break;
- case ResourceTable.Id_shagnchu_db:
- DatabaseUtils.deleteFormData(100l,connect);
- break;
- default:
- }
- }
- private void insertDB(){
- // 存儲卡片信息
- User form = new User(100l, "陳建朋", 101);
- try {
- DatabaseUtils.insertForm(form, connect);
- } catch (Exception e) {
- DatabaseUtils.deleteFormData(form.getFormId(), connect);
- }
- }
注意:如果使用注解處理器的模塊為“com.huawei.ohos.hap”模塊,則需要在模塊的“build.gradle”文件的“ohos”節(jié)點中添加以下配置:
- ohos {
- compileSdkVersion 5
- defaultConfig {
- compatibleSdkVersion 5
- }
- buildTypes {
- release {
- proguardOpt {
- proguardEnabled false
- rulesFiles 'proguard-rules.pro'
- }
- }
- }
- compileOptions { annotationEnabled true } // 數(shù)據(jù)庫使用必備
- }
可以在該類中直接創(chuàng)建數(shù)據(jù)庫和表,也可以在啟動應(yīng)用的時候創(chuàng)建,全局使用connect,
在該類中可以進(jìn)行 數(shù)據(jù)庫的調(diào)用操作,直接調(diào)用已經(jīng)封裝好的 數(shù)據(jù)庫操作工具類。
到此,有關(guān)對象關(guān)系映射數(shù)據(jù)庫 就結(jié)束了,是不是很簡單。
感悟
通過學(xué)習(xí)鴻蒙的關(guān)系型數(shù)據(jù)庫和對象關(guān)系映射數(shù)據(jù)庫發(fā)現(xiàn)鴻蒙的強(qiáng)大之處,其實在對象關(guān)系映射數(shù)據(jù)庫中都可以做到不需要寫sql語句就能完成項目的開發(fā)和使用。
鴻蒙系統(tǒng)這么強(qiáng)大肯定還有很多強(qiáng)大之處我還沒有了解到,還有很多好東西還等待我去探索,探索還在進(jìn)行中,但是這些對鴻蒙來說只是九牛一毛罷了。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)






