日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

鸿蒙对象关系映射数据库

發布時間:2023/12/14 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 鸿蒙对象关系映射数据库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對象關系映射數據庫

  • 對象關系映射數據庫簡介
  • 對象關系映射數據庫存儲開發步驟
    • 1、添加配置
    • 2、數據庫的創建
    • 3、數據表(實體對象類)的創建
    • 4、使用對象數據操作接口OrmContext創建數據庫
    • 5、數據庫升降級(可選)
    • 6、使用對象數據操作接口OrmContext對數據庫進行增刪改查、注冊觀察者、備份數據庫等

對象關系映射數據庫簡介

官網介紹:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-orm-overview-0000000000030070
HarmonyOS對象關系映射(Object Relational Mapping,ORM)數據庫是一款基于SQLite的數據庫框架,屏蔽了底層SQLite數據庫的SQL操作,針對實體和關系提供了增刪改查等一系列的面向對象接口。應用開發者不必再去編寫復雜的SQL語句, 以操作對象的形式來操作數據庫,提升效率的同時也能聚焦于業務開發。
HarmonyOS對象關系映射數據庫是建立在HarmonyOS關系型數據庫的基礎之上的,ORM就是在關系型數據庫操作的基礎上做了進一步封裝,目的是將Java的類和數據庫的表建立關聯對應關系,除了數據庫版本升降級等場景外,操作對象關系映射數據庫一般不需要編寫SQL語句,這樣用起來更方便,更好用。
使用場景介紹:對象關系映射數據庫適用于開發者使用的數據可以分解為一個或多個對象,且需要對數據進行增刪改查等操作,但是不希望編寫過于復雜的SQL語句的場景。
開發能力介紹:對象關系映射數據庫目前可以支持數據庫和表的創建,對象數據的增刪改查、對象數據變化回調、數據庫升降級和備份等功能。
對象關系映射數據庫的三個主要組件:
①數據庫:被開發者用@Database注解,且繼承了OrmDatabase的類,對應關系型數據庫。
②實體對象:被開發者用@Entity注解,且繼承了OrmObject的類,對應關系型數據庫中的表。
③對象數據操作接口:包括數據庫操作的入口OrmContext類和謂詞接口(OrmPredicate)等。

對象關系映射數據庫存儲開發步驟

官網文檔:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-orm-guidelines-0000000000030063

1、添加配置

在build.gradle中配置(如果使用注解處理器的模塊為“com.huawei.ohos.hap”模塊,則需要在模塊的“build.gradle”文件的“ohos”節點中添加以下配置)

compileOptions { annotationEnabled true }

如果沒有添加這個配置,則會出現Cannot resolve symbol ‘Database‘、Cannot resolve symbol ‘Entity‘錯誤,詳情可見本人《鴻蒙出現Cannot resolve symbol ‘Database‘、Cannot resolve symbol ‘Entity‘錯誤》文章。

2、數據庫的創建

開發者需要定義一個表示數據庫的類,繼承OrmDatabase,再通過@Database注解內的entities屬性指定哪些數據模型類屬于這個數據庫。

/*** 對象關系映射數據庫的數據庫類BookStore** @author 舒小羽* @date 2021/0/0 0027*/ //創建數據庫。 //開發者定義一個表示數據庫的類,繼承OrmDatabase, //再通過@Database注解內的entities屬性指定數據庫內包含的表,version為數據庫版本號。 @Database(entities = {User.class}, version = 1) public abstract class BookStore extends OrmDatabase {//數據庫類的getVersion方法和getHelper方法不需要實現,直接將數據庫類設為虛類即可。//以下的方法可以不用實現@Overridepublic int getVersion() {return 1;//當前數據庫版本號為1}@Overridepublic RdbOpenCallback getHelper() {return new RdbOpenCallback() {@Overridepublic void onCreate(RdbStore rdbStore) {//創建成功后執行操作HiLog.error(new HiLogLabel(HiLog.LOG_APP, 0xD00201, "Data_Log"), "對象關系映射數據庫創建成功");}@Overridepublic void onUpgrade(RdbStore rdbStore, int oldVersion, int newVersion) {//數據庫升級需要執行的操作}};} }

3、數據表(實體對象類)的創建

開發者可通過創建一個繼承了OrmObject并用@Entity注解的類,獲取數據庫實體對象,也就是表的對象。數據表必須與其所在的數據庫在同一個模塊中。
注解對照表

接口名稱描述
@Database被@Database注解且繼承了OrmDatabase的類對應數據庫類。
@Entity被@Entity注解且繼承了OrmObject的類對應數據表類。
@Column被@Column注解的變量對應數據表的字段。
@PrimaryKey被@PrimaryKey注解的變量對應數據表的主鍵。
@ForeignKey被@ForeignKey注解的變量對應數據表的外鍵。
@Index被@Index注解的內容對應數據表索引的屬性。
/*** 對象關系映射數據庫的實體對象類User** @author 舒小羽* @date 2021/0/0 0027*/ //創建數據表。(數據表必須與其所在的數據庫在同一個模塊中) //開發者創建一個繼承了OrmObject并用@Entity注解的類, //獲取數據庫實體對象,也就是表的對象。 //tableName:表名 //"ignoredColumns"表示該字段不需要添加到"user"表的屬性中 //indices:索引列表。indices為"identityCardNumber"和"telephoneNumber"兩個字段建立了復合索引"name_index",并且索引值是唯一的 @Entity(tableName = "user", ignoredColumns = {"ignoreColumn1", "ignoreColumn2"},indices = {@Index(value = {"identityCardNumber", "telephoneNumber"}, 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 String identityCardNumber;private String telephoneNumber;private int ignoreColumn1;private int ignoreColumn2;//開發者自行添加字段的getter和setter方法。public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getBalance() {return balance;}public void setBalance(double balance) {this.balance = balance;}public String getIdentityCardNumber() {return identityCardNumber;}public void setIdentityCardNumber(String identityCardNumber) {this.identityCardNumber = identityCardNumber;}public String getTelephoneNumber() {return telephoneNumber;}public void setTelephoneNumber(String telephoneNumber) {this.telephoneNumber = telephoneNumber;}public int getIgnoreColumn1() {return ignoreColumn1;}public void setIgnoreColumn1(int ignoreColumn1) {this.ignoreColumn1 = ignoreColumn1;}public int getIgnoreColumn2() {return ignoreColumn2;}public void setIgnoreColumn2(int ignoreColumn2) {this.ignoreColumn2 = ignoreColumn2;}}

注:①數據表必須與其所在的數據庫在同一個模塊中
②如果要創建多個表一定注意索引的名字index這個值不能重復

4、使用對象數據操作接口OrmContext創建數據庫

通過對象數據操作接口OrmContext,創建一個別名為“BookStore”,數據庫文件名為“BookStore.db”的數據庫。如果數據庫已經存在,執行以下代碼不會重復創建。通過context.getDatabaseDir()可以獲取創建的數據庫文件所在的目錄。
在MainAbilitySlice中

//在前面的配置、數據庫類、數據庫表類都弄好的前提下,創建數據庫和表DatabaseHelper helper = new DatabaseHelper(this);OrmContext ormContext = helper.getOrmContext("BookStore", "BookStore.db", BookStore.class);HiLog.error(LABEL_LOG, "創建數據庫成功");

5、數據庫升降級(可選)

如果開發者有多個版本的數據庫,通過設置數據庫版本遷移類可以實現數據庫版本升降級。
數據庫版本升降級的調用示例如下。

//數據庫升降級//BookStoreUpgrade類也是一個繼承了OrmDatabase的數據庫類,與BookStore類的區別在于配置的版本號不同mOrmContext = helper.getOrmContext(DATABASE_NAME_ALIAS, DATABASE_NAME, BookStoreUpgrade.class, new TestOrmMigration12());

有多次升降級的寫法

OrmContext context = helper.getOrmContext("BookStore", "BookStore.db", BookStoreUpgrade.class, new TestOrmMigration32(), new TestOrmMigration23(), new TestOrmMigration12(), new TestOrmMigration21());

TestOrmMigration12的實現示例如下:

//數據庫升降級private static class TestOrmMigration12 extends OrmMigration {// 此處用于配置數據庫版本遷移的開始版本和結束版本,super(startVersion, endVersion)即數據庫版本號從1升到2。public TestOrmMigration12() {super(1, 2);}@Overridepublic void onMigrate(RdbStore store) {store.executeSql("ALTER TABLE `BookStore` ADD COLUMN `addColumn12` INTEGER");}}

數據庫版本遷移類的起始版本和結束版本必須是連續的。

6、使用對象數據操作接口OrmContext對數據庫進行增刪改查、注冊觀察者、備份數據庫等

增刪改查與事務

//增加數據//在數據庫的名為“user”的表中,新建一個User對象并設置對象的屬性User user_insert = new User();user_insert.setFirstName("張");user_insert.setLastName("三");user_insert.setAge(20);user_insert.setBalance(120.51);//直接傳入OrmObject對象的增加接口,只有在flush()接口被調用后才會持久化到數據庫中boolean isSuccessed1 = ormContext.insert(user_insert);//保存到內存(這里的插入是在內存,沒有真正的把數據落地到倉庫)boolean isSuccessed2 = ormContext.flush();//保存到本地數據庫(這個方法才是真正的落地到倉庫)HiLog.error(LABEL_LOG, "增加數據isSuccessed:" + isSuccessed1 + "," + isSuccessed2);//開啟事務ormContext.beginTransaction();HiLog.error(LABEL_LOG, "============開啟事務============");try {User user1 = new User();user1.setFirstName("王");user1.setLastName("wu");user1.setAge(28);user1.setBalance(130.00);ormContext.insert(user1);ormContext.flush();//獲取數據,查詢數據OrmPredicates ormPredicates =ormContext.where(User.class).equalTo("firstName", "王");List<User> userList_transaction = ormContext.query(ormPredicates);User user_transaction = userList_transaction.get(0);//刪除數據ormContext.delete(user_transaction);ormContext.flush();//提交事務ormContext.commit();HiLog.error(LABEL_LOG, "============提交事務============");} catch (Exception e) {HiLog.error(LABEL_LOG, "============出錯了============");//回滾ormContext.rollback();HiLog.error(LABEL_LOG, "============回滾============");}//查詢列表驗證并打印List<User> UserList_Transaction = ormContext.query(ormContext.where(User.class));for (User user : UserList_Transaction) {HiLog.error(LABEL_LOG, "查詢到事務后的users的所有firstName:" + user.getFirstName());}//查詢數據//在數據庫的“user”表中查詢lastName為“三”的User對象列表,示例如下OrmPredicates query1 = ormContext.where(User.class).equalTo("firstName", "張");List<User> usersList1 = ormContext.query(query1);HiLog.error(LABEL_LOG, "查詢到的users的FirstName:" + usersList1.get(0).getFirstName());OrmPredicates query2 = ormContext.where(User.class).equalTo("firstName", "張").and().equalTo("lastName", "三");List<User> usersList2 = ormContext.query(query2);HiLog.error(LABEL_LOG, "查詢到的users的Age:" + usersList2.get(0).getAge());ResultSet res_query = ormContext.query(query1, new String[]{"lastName", "firstName", "userId"});//處理結果while (res_query.goToNextRow()) {//在此處理ResultSet中的記錄HiLog.error(LABEL_LOG, "查詢到的users的userId:" + res_query.getString(2));}//更新或刪除數據,分為兩種情況://法一:// 通過直接傳入OrmObject對象的接口來更新數據// 需要先從表中查到需要更新的User對象列表,然后修改對象的值,再調用更新接口持久化到數據庫中。// 刪除數據與更新數據的方法類似,只是不需要更新對象的值。// 更新數據(先查后改)OrmPredicates predicates_update1 = ormContext.where(User.class);predicates_update1.equalTo("age", 20);List<User> userList_update1 = ormContext.query(predicates_update1);User user_update1 = userList_update1.get(0);user_update1.setFirstName("李");boolean isTure_update1 = ormContext.update(user_update1);ormContext.flush();HiLog.error(LABEL_LOG, "更新數據成功" + isTure_update1);//查詢列表驗證并打印OrmPredicates query_update1 = ormContext.where(User.class).equalTo("age", 20);List<User> usersList_update1 = ormContext.query(query_update1);HiLog.error(LABEL_LOG, "更新數據后查詢列表驗證并打印FirstName:" + usersList_update1.get(0).getFirstName());// 刪除數據(先查后刪)OrmPredicates predicates_delete1 = ormContext.where(User.class);predicates_delete1.equalTo("balance", 120.51);List<User> userList_delete1 = ormContext.query(predicates_delete1);User user_delete1 = userList_delete1.get(0);boolean isTure_delete1 = ormContext.delete(user_delete1);ormContext.flush();HiLog.error(LABEL_LOG, "刪除數據成功" + isTure_delete1);//查詢列表驗證并打印OrmPredicates query_delete1 = ormContext.where(User.class).equalTo("balance", 120.51);List<User> usersList_delete1 = ormContext.query(query_delete1);if (usersList_delete1.isEmpty()) {HiLog.error(LABEL_LOG, "刪除數據后查詢列表驗證并打印:Empty");}//法二:// 通過傳入謂詞的接口來更新和刪除數據,方法與OrmObject對象的接口類似,只是無需flush就可以持久化到數據庫中//釋放下面方法時,請注釋上方法一// 更新數據 // ValuesBucket valuesBucket = new ValuesBucket(); // valuesBucket.putInteger("age", 30); // valuesBucket.putDouble("balance", 150.00); // OrmPredicates update = ormContext.where(User.class).equalTo("firstName", "張"); // ormContext.update(update, valuesBucket); // HiLog.error(LABEL_LOG, "更新數據成功" + ormContext.update(update, valuesBucket)); // //查詢列表驗證并打印 // OrmPredicates query_update2 = ormContext.where(User.class).equalTo("firstName", "張"); // List<User> usersList_update2 = ormContext.query(query_update2); // HiLog.error(LABEL_LOG, "更新數據后查詢列表驗證并打印Age:" + usersList_update2.get(0).getAge()); // // 刪除數據 // OrmPredicates predicates_delete2 = ormContext.where(User.class).equalTo("balance", 150.00); // int index_delete2 = ormContext.delete(predicates_delete2); // HiLog.error(LABEL_LOG, "刪除數據成功" + index_delete2); // //查詢列表驗證并打印 // OrmPredicates query_delete2 = ormContext.where(User.class).equalTo("balance", 120.51); // List<User> usersList_delete2 = ormContext.query(query_delete2); // if (usersList_delete2.isEmpty()) { // HiLog.error(LABEL_LOG, "刪除數據后查詢列表驗證并打印:Empty"); // }}

注冊觀察者備份數據庫刪除數據庫等以后會補充在此文章中,敬請期待!

總結

以上是生活随笔為你收集整理的鸿蒙对象关系映射数据库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男人天堂伊人 | 污污的网站在线免费观看 | 一级欧美一级日韩 | 国产精品午夜电影 | 极品销魂美女一区二区三区 | 精品亚洲综合 | 男人天堂视频在线 | 国产我不卡 | 91精品久久久久久久久中文字幕 | 亚洲无码精品在线观看 | 蜜臀av午夜精品 | 中文字幕免| 日本少妇bb | brazzers欧美极品少妇 | www日本免费| 蜜桃臀av一区二区三区 | 国产精品视频一区二区三区在3 | 性欧美一区二区三区 | 日韩美一区二区三区 | 国产ts人妖系列高潮 | 91精彩视频在线观看 | 国产精品久久久精品 | 亚洲精品伊人 | 欧美日韩国产精品一区二区三区 | 欧美色图在线视频 | 91av视频免费观看 | 中文字字幕在线中文乱码电影 | 国产免费黄色录像 | 久久久久亚洲AV成人无在 | 四虎精品成人免费网站 | 色综合啪啪 | 欧美高清hd18日本 | 三级网站免费看 | 加勒比精品 | 欧美日韩一区视频 | 牛人盗摄一区二区三区视频 | 午夜99 | 亚洲国产无码久久 | 天天操天天干天天插 | 性欧美www| 欧美精品福利 | 中文字幕第4页 | 丰满少妇毛片 | 日韩1区| 99视频久 | 国产黄色成人 | 成人亚洲综合 | 97精品国产 | 午夜色福利 | 99久久久久久 | 色九九九| 8090av | 久久亚洲av成人无码国产电影 | 一区二区三区四区精品视频 | 少妇按摩一区二区三区 | 日本www| 精品一区免费 | 成人av网站免费 | 玉足调教丨vk24分钟 | 96精品视频 | 青青操免费在线视频 | 又黄又色又爽 | 欧美片网站免费 | 人人澡澡人人 | 99精品视频在线观看免费 | 亚洲黄色片子 | 99re99热| 色又黄又爽 | 人人看人人艹 | 亚洲影视一区 | 少妇精品无码一区二区 | 久久精品香蕉视频 | 影音先锋成人 | 国产66页 | 男女啪啪av| 亚洲综合av一区二区三区 | 丝袜老师扒开让我了一夜漫画 | 欧美黄色小说 | 久久看av | 国产成人综合欧美精品久久 | 男生尿隔着内裤呲出来视频 | 97超碰人人澡人人爱学生 | 中国黄色免费网站 | av卡一卡二| 又色又爽又黄18网站 | 夜夜嗨av一区二区三区网页 | 91在线无精精品一区二区 | 国产污片在线观看 | 户外少妇对白啪啪野战 | 奇米狠狠去啦 | 九色网址 | 91久久极品少妇xxxxⅹ软件 | 无码乱人伦一区二区亚洲 | 97视频网站| 特级淫片裸体免费看 | 国产成人免费在线观看 | 国产精品久久久久久久一区探花 | 欧美乱论视频 | 欧美性插视频 |