鸿蒙对象关系映射数据库
對象關系映射數據庫
- 對象關系映射數據庫簡介
- 對象關系映射數據庫存儲開發步驟
- 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”節點中添加以下配置)
如果沒有添加這個配置,則會出現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注解的內容對應數據表索引的屬性。 |
注:①數據表必須與其所在的數據庫在同一個模塊中
②如果要創建多個表一定注意索引的名字index這個值不能重復
4、使用對象數據操作接口OrmContext創建數據庫
通過對象數據操作接口OrmContext,創建一個別名為“BookStore”,數據庫文件名為“BookStore.db”的數據庫。如果數據庫已經存在,執行以下代碼不會重復創建。通過context.getDatabaseDir()可以獲取創建的數據庫文件所在的目錄。
在MainAbilitySlice中
5、數據庫升降級(可選)
如果開發者有多個版本的數據庫,通過設置數據庫版本遷移類可以實現數據庫版本升降級。
數據庫版本升降級的調用示例如下。
有多次升降級的寫法
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"); // }}注冊觀察者、備份數據庫、刪除數據庫等以后會補充在此文章中,敬請期待!
總結
以上是生活随笔為你收集整理的鸿蒙对象关系映射数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OSS产品Bucket分级的使用场景及注
- 下一篇: 求任意多边形面积