1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 3422字,需瀏覽 7分鐘

         ·

        2021-10-26 11:34


        前言

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


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


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


        簡(jiǎn)介

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


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


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

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

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

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

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

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

        這也是數(shù)據(jù)庫(kù)的一種很好的擴(kuò)展,讓開發(fā)更簡(jiǎn)單方便。

        創(chuàng)建數(shù)據(jù)庫(kù)及其表

        數(shù)據(jù)庫(kù)的創(chuàng)建可以根據(jù)自己需求,如果 在項(xiàng)目啟動(dòng)就需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù),建議在 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ù)說(shuō)明 :
        • 1、別名
        • 2、數(shù)據(jù)庫(kù)名
        • 3、對(duì)象-對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫(kù)。
        還有一點(diǎn) 需要注意,最后的參數(shù)就是表的創(chuàng)建,如果要?jiǎng)?chuàng)建多張表,可以添加多個(gè) 實(shí)體類。

        來(lái)看看如下的 對(duì)象關(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的類,對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫(kù)。

        數(shù)據(jù)對(duì)象:

        每一個(gè)數(shù)據(jù)對(duì)象就是一個(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的類,對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫(kù)中的表。

        數(shù)據(jù)庫(kù)使用

        在使用數(shù)據(jù)庫(kù)之前最好是整理一個(gè) 工具類,所有的操作都放在工具類中,這樣調(diào)用和擴(kuò)展都方便了。

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

        關(guān)系對(duì)象型數(shù)據(jù)庫(kù)的操作工具類:


        /** * 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ù)庫(kù)中獲取信息 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ù)庫(kù)實(shí)體 * @param user user */public static void updateForms(OrmContext connect,User user) {// 從數(shù)據(jù)庫(kù)中獲取信息 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ù)庫(kù)的“user”表中查詢formId為“”的User對(duì)象列表 List query = connect.query(where);if (!query.isEmpty()) { connect.delete(query.get(0)); connect.flush(); } }}


        • 1、數(shù)據(jù)庫(kù)操作的入口OrmContext類 ,進(jìn)行數(shù)據(jù)庫(kù)操作
        • 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ù)庫(kù)使用必備}


        可以在該類中直接創(chuàng)建數(shù)據(jù)庫(kù)和表,也可以在啟動(dòng)應(yīng)用的時(shí)候創(chuàng)建,全局使用connect,在該類中可以進(jìn)行 數(shù)據(jù)庫(kù)的調(diào)用操作,直接調(diào)用已經(jīng)封裝好的 數(shù)據(jù)庫(kù)操作工具類。到此,有關(guān)對(duì)象關(guān)系映射數(shù)據(jù)庫(kù) 就結(jié)束了,是不是很簡(jiǎn)單。

        感悟

        通過(guò)學(xué)習(xí)鴻蒙的關(guān)系型數(shù)據(jù)庫(kù)和對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)發(fā)現(xiàn)鴻蒙的強(qiáng)大之處,其實(shí)在對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)中都可以做到不需要寫sql語(yǔ)句就能完成項(xiàng)目的開發(fā)和使用。

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

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

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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            人妻专区 | 天堂网成人 | 91精品综合久久久久久猫猫 | 久久襙 | 成人免费无遮挡黄H网站在线观看 | 国产又黄又爽又色的免费视频 | 骚逼视频网站 | 国产老头老太一级视频 | 三级乱伦视频 | www.色呦呦 |