<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          HarmonyOS 數(shù)據(jù)庫系列之對象關(guān)系映射數(shù)據(jù)庫

          共 3422字,需瀏覽 7分鐘

           ·

          2021-10-26 11:34


          前言

          鴻蒙提供了非常強(qiáng)大的數(shù)據(jù)庫操作功能, 前面講到了 關(guān)系型數(shù)據(jù)庫, 是基于關(guān)系模型來管理數(shù)據(jù)的數(shù)據(jù)庫。


          其實(shí)鴻蒙還有一種 體驗(yàn)更好,操作更方便的數(shù)據(jù)庫 ,對象關(guān)系映射數(shù)據(jù)庫, 這種數(shù)據(jù)庫的好處是 直接基于sqlite數(shù)據(jù)庫架構(gòu)的, 操作sql語句的操作更簡單,可以直接配置進(jìn)行。


          其實(shí)這種配置更像做web后臺(tái)系統(tǒng)的開發(fā),一個(gè)類就是一個(gè)表,如果需要添加信息直接更新實(shí)體類就行。


          簡介

          先了解一下概念,概念是一切功能的使用總結(jié)。


          HarmonyOS對象關(guān)系映射(Object Relational Mapping,ORM)數(shù)據(jù)庫是一款基于SQLite的數(shù)據(jù)庫框架,屏蔽了底層SQLite數(shù)據(jù)庫的SQL操作,針對實(shí)體和關(guān)系提供了增刪改查等一系列的面向?qū)ο蠼涌凇?yīng)用開發(fā)者不必再去編寫復(fù)雜的SQL語句, 以操作對象的形式來操作數(shù)據(jù)庫,提升效率的同時(shí)也能聚焦于業(yè)務(wù)開發(fā)。


          在我看來 對象關(guān)系映射數(shù)據(jù)庫非常重要的 三個(gè) 組件:

          • 數(shù)據(jù)庫:被開發(fā)者用@Database注解,且繼承了OrmDatabase的類,對應(yīng)關(guān)系型數(shù)據(jù)庫。
          • 實(shí)體對象:被開發(fā)者用@Entity注解,且繼承了OrmObject的類,對應(yīng)關(guān)系型數(shù)據(jù)庫中的表。
          • 對象數(shù)據(jù)操作接口:包括數(shù)據(jù)庫操作的入口OrmContext類和謂詞接口(OrmPredicate)。
          肯定還有更多的其它方面,以后繼續(xù)補(bǔ)充吧。

          運(yùn)作機(jī)制

          運(yùn)作機(jī)制 我查看了一下官網(wǎng)的說明, 說了一大堆。其實(shí)主要的還是對 關(guān)系型數(shù)據(jù)庫的擴(kuò)展:

          對象關(guān)系映射數(shù)據(jù)庫操作是基于關(guān)系型數(shù)據(jù)庫操作接口完成的,實(shí)際是在關(guān)系型數(shù)據(jù)庫操作的基礎(chǔ)上又實(shí)現(xiàn)了對象關(guān)系映射等特性。

          全部介紹如下:
          • 對象關(guān)系映射數(shù)據(jù)庫操作是基于關(guān)系型數(shù)據(jù)庫操作接口完成的,實(shí)際是在關(guān)系型數(shù)據(jù)庫操作的基礎(chǔ)上又實(shí)現(xiàn)了對象關(guān)系映射等特性。因此對象關(guān)系映射數(shù)據(jù)庫跟關(guān)系型數(shù)據(jù)庫一樣,都使用SQLite作為持久化引擎,底層使用的是同一套數(shù)據(jù)庫連接池和數(shù)據(jù)庫連接機(jī)制。
          • 使用對象關(guān)系映射數(shù)據(jù)庫的開發(fā)者需要先配置實(shí)體模型與關(guān)系映射文件。應(yīng)用數(shù)據(jù)管理框架提供的類生成工具會(huì)解析這些文件,生成數(shù)據(jù)庫幫助類,這樣應(yīng)用數(shù)據(jù)管理框架就能在運(yùn)行時(shí),根據(jù)開發(fā)者的配置創(chuàng)建好數(shù)據(jù)庫,并在存儲(chǔ)過程中自動(dòng)完成對象關(guān)系映射。開發(fā)者再通過對象數(shù)據(jù)操作接口,如OrmContext接口和謂詞接口等操作持久化數(shù)據(jù)庫。
          • 對象數(shù)據(jù)操作接口提供一組基于對象映射的數(shù)據(jù)操作接口,實(shí)現(xiàn)了基于SQL的關(guān)系模型數(shù)據(jù)到對象的映射,讓用戶不需要再和復(fù)雜的 SQL語句打交道,只需簡單地操作實(shí)體對象的屬性和方法。對象數(shù)據(jù)操作接口支持對象的增刪改查操作,同時(shí)支持事務(wù)操作等。
          對象關(guān)系映射數(shù)據(jù)庫運(yùn)作機(jī)制:
          從上圖運(yùn)行機(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ù)自己需求,如果 在項(xiàng)目啟動(dòng)就需要?jiǎng)?chuàng)建數(shù)據(jù)庫,建議在 application中執(zhí)行啟動(dòng)操作。

          這里我們 在 每一個(gè) 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ù)庫。
          還有一點(diǎn) 需要注意,最后的參數(shù)就是表的創(chuàng)建,如果要?jiǎng)?chuàng)建多張表,可以添加多個(gè) 實(shí)體類。

          來看看如下的 對象關(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ù)對象:

          每一個(gè)數(shù)據(jù)對象就是一個(gè)表,字段信息可以根據(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ù)庫之前最好是整理一個(gè) 工具類,所有的操作都放在工具類中,這樣調(diào)用和擴(kuò)展都方便了。

          我就對數(shù)據(jù)庫的有關(guān)操作 做了一個(gè)封裝,目前也是比較簡單的,只是做了增,刪,改,查等操作。

          關(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 queryForm(OrmContext connect){// 從數(shù)據(jù)庫中獲取信息 OrmPredicates ormPredicates = new OrmPredicates(User.class);// 搜索實(shí)例 List 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ù)庫實(shí)體 * @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 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)行實(shí)例的制定(例如:條件查詢,條件刪除)
          • 3、ValuesBucket 實(shí)例

          操作使用:

          創(chuàng)建一個(gè) ability,該類是需求操作界面類。
          public class DatabaseObjectAbility extends Ability implements Component.ClickedListener {private DatabaseHelper helper = new DatabaseHelper(this);private OrmContext connect;
          @Overridepublic 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); }
          @Overridepublic 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(){// 存儲(chǔ)卡片信息 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é)點(diǎn)中添加以下配置:


          ohos {compileSdkVersion 5 defaultConfig {compatibleSdkVersion 5 } buildTypes {release {proguardOpt {proguardEnabled false rulesFiles 'proguard-rules.pro' } } } compileOptions { annotationEnabled true } // 數(shù)據(jù)庫使用必備}


          可以在該類中直接創(chuàng)建數(shù)據(jù)庫和表,也可以在啟動(dòng)應(yīng)用的時(shí)候創(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)大之處,其實(shí)在對象關(guān)系映射數(shù)據(jù)庫中都可以做到不需要寫sql語句就能完成項(xiàng)目的開發(fā)和使用。

          鴻蒙系統(tǒng)這么強(qiáng)大肯定還有很多強(qiáng)大之處我還沒有了解到,還有很多好東西還等待我去探索,探索還在進(jìn)行中,但是這些對鴻蒙來說只是九牛一毛罷了。

          逆鋒起筆是一個(gè)專注于程序員圈子的技術(shù)平臺(tái),你可以收獲最新技術(shù)動(dòng)態(tài)最新內(nèi)測資格BAT等大廠的經(jīng)驗(yàn)精品學(xué)習(xí)資料職業(yè)路線副業(yè)思維,微信搜索逆鋒起筆關(guān)注!

          HarmonyOS | 鴻蒙系統(tǒng)內(nèi)置原生壁紙下載
          華為 HarmonyOS 系統(tǒng)一鍵升級指南來了!
          鴻蒙之后,華為祭出歐拉!
          鴻蒙操作系統(tǒng)入門到精通.pdf
          鴻蒙開發(fā)初體驗(yàn)
          瀏覽 78
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          自學(xué)HarmonyOS應(yīng)用開發(fā)(63)- 對象關(guān)系映射數(shù)據(jù)庫升級
          自學(xué)HarmonyOS應(yīng)用開發(fā)(62)- 使用對象關(guān)系映射數(shù)據(jù)庫保存設(shè)定信息
          自學(xué)HarmonyOS應(yīng)用開發(fā)(55)- 使用對象關(guān)系映射數(shù)據(jù)庫保存地圖數(shù)據(jù)
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  三级黄色天天天天 | 国外三级片网站 | ww99色| 美女黄片视频 | 婷婷五月天操 |