日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
創(chuàng)新互聯(lián)鴻蒙OS教程:鴻蒙OS對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)開(kāi)發(fā)指導(dǎo)

場(chǎng)景介紹

成都創(chuàng)新互聯(lián)長(zhǎng)期為1000+客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為天心企業(yè)提供專(zhuān)業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè),天心網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)適用于開(kāi)發(fā)者使用的數(shù)據(jù)可以分解為一個(gè)或多個(gè)對(duì)象,且需要對(duì)數(shù)據(jù)進(jìn)行增刪改查等操作,但是不希望編寫(xiě)過(guò)于復(fù)雜的 SQL 語(yǔ)句的場(chǎng)景。

該對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)的實(shí)現(xiàn)是基于關(guān)系型數(shù)據(jù)庫(kù),除了數(shù)據(jù)庫(kù)版本升降級(jí)等場(chǎng)景外,操作對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)一般不需要編寫(xiě) SQL 語(yǔ)句,但是仍然要求使用者對(duì)于關(guān)系型數(shù)據(jù)庫(kù)的基本概念有一定的了解。

開(kāi)發(fā)能力介紹

對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)目前可以支持?jǐn)?shù)據(jù)庫(kù)和表的創(chuàng)建,對(duì)象數(shù)據(jù)的增刪改查、對(duì)象數(shù)據(jù)變化回調(diào)、數(shù)據(jù)庫(kù)升降級(jí)和備份等功能。

數(shù)據(jù)庫(kù)和表的創(chuàng)建

  1. 創(chuàng)建數(shù)據(jù)庫(kù)。開(kāi)發(fā)者需要定義一個(gè)表示數(shù)據(jù)庫(kù)的類(lèi),繼承 OrmDatabase,再通過(guò) @Database 注解內(nèi)的 entities 屬性指定哪些數(shù)據(jù)模型類(lèi)屬于這個(gè)數(shù)據(jù)庫(kù)。

屬性:

  • version:數(shù)據(jù)庫(kù)版本號(hào)。
  • entities:數(shù)據(jù)庫(kù)內(nèi)包含的表。
  1. 創(chuàng)建數(shù)據(jù)表。開(kāi)發(fā)者可通過(guò)創(chuàng)建一個(gè)繼承了OrmObject 并用 @Entity 注解的類(lèi),獲取數(shù)據(jù)庫(kù)實(shí)體對(duì)象,也就是表的對(duì)象。

屬性:

  • tableName:表名。
  • primaryKeys:主鍵名,一個(gè)表里只能有一個(gè)主鍵,一個(gè)主鍵可以由多個(gè)字段組成。
  • foreignKeys:外鍵列表。
  • indices:索引列表。
接口名稱(chēng) 描述
@Database 被 @Database注解且繼承了 OrmDatabase 的類(lèi)對(duì)應(yīng)數(shù)據(jù)庫(kù)類(lèi)。
@Entity 被 @Entity注解且繼承了 OrmObject 的類(lèi)對(duì)應(yīng)數(shù)據(jù)表類(lèi)。
@Column 被 @Column 注解的變量對(duì)應(yīng)數(shù)據(jù)表的字段。
@PrimaryKey 被 @PrimaryKey 注解的變量對(duì)應(yīng)數(shù)據(jù)表的主鍵。
@ForeignKey 被 @ForeignKey 注解的變量對(duì)應(yīng)數(shù)據(jù)表的外鍵。
@Index 被 @Index 注解的內(nèi)容對(duì)應(yīng)數(shù)據(jù)表索引的屬性。

數(shù)據(jù)庫(kù)的加密

對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)提供數(shù)據(jù)庫(kù)加密的能力,創(chuàng)建數(shù)據(jù)庫(kù)時(shí)傳入指定密鑰、創(chuàng)建加密數(shù)據(jù)庫(kù),后續(xù)打開(kāi)加密數(shù)據(jù)庫(kù)時(shí),需要傳入正確密鑰。

類(lèi)名 接口名 描述
OrmConfig.Builder Builder setEncryptKey(byte[] encryptKey) 為數(shù)據(jù)庫(kù)配置類(lèi)設(shè)置數(shù)據(jù)庫(kù)加密密鑰,創(chuàng)建或打開(kāi)數(shù)據(jù)庫(kù)時(shí)傳入包含數(shù)據(jù)庫(kù)加密密鑰的配置類(lèi),即可創(chuàng)建或打開(kāi)加密數(shù)據(jù)庫(kù)。

對(duì)象數(shù)據(jù)的增刪改查

通過(guò)對(duì)象數(shù)據(jù)操作接口,開(kāi)發(fā)者可以對(duì)對(duì)象數(shù)據(jù)進(jìn)行增刪改查操作。

類(lèi)名 接口名稱(chēng) 描述
OrmContext  boolean insert(T object) 添加方法。
OrmContext  boolean update(T object) 更新方法。
OrmContext  List query(OrmPredicates predicates) 查詢(xún)方法。
OrmContext  boolean delete(T object) 刪除方法。
OrmContext  OrmPredicates where(Class clz) 設(shè)置謂詞方法。

對(duì)象數(shù)據(jù)的變化觀察者**設(shè)置**

通過(guò)使用對(duì)象數(shù)據(jù)操作接口,開(kāi)發(fā)者可以在某些數(shù)據(jù)上設(shè)置觀察者,接收數(shù)據(jù)變化的通知。

類(lèi)名 接口名稱(chēng) 描述
OrmContext void registerStoreObserver(String alias, OrmObjectObserver observer) 注冊(cè)數(shù)據(jù)庫(kù)變化回調(diào)。
OrmContext void registerContextObserver(OrmContext watchedContext, OrmObjectObserver observer) 注冊(cè)上下文變化回調(diào)。
OrmContext void registerEntityObserver(String entityName, OrmObjectObserver observer) 注冊(cè)數(shù)據(jù)庫(kù)實(shí)體變化回調(diào)。
OrmContext void registerObjectObserver(OrmObject ormObject, OrmObjectObserver observer) 注冊(cè)對(duì)象變化回調(diào)。

數(shù)據(jù)庫(kù)的升降級(jí)

通過(guò)調(diào)用數(shù)據(jù)庫(kù)升降級(jí)接口,開(kāi)發(fā)者可以將數(shù)據(jù)庫(kù)切換到不同的版本。

類(lèi)名 接口名稱(chēng) 描述
OrmMigration public void onMigrate(int beginVersion, int endVersion) 數(shù)據(jù)庫(kù)版本升降級(jí)接口。

數(shù)據(jù)庫(kù)的備份恢復(fù)

開(kāi)發(fā)者可以將當(dāng)前數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行備份,在必要的時(shí)候進(jìn)行數(shù)據(jù)恢復(fù)。

類(lèi)名 接口名稱(chēng) 描述
OrmContext boolean backup(String destPath) 數(shù)據(jù)庫(kù)備份接口。
OrmContext boolean restore(String srcPath); 數(shù)據(jù)庫(kù)恢復(fù)備份接口。

開(kāi)發(fā)步驟

  1. 配置“build.gradle”文件。
  • 如果使用注解處理器的模塊為“com.huawei.ohos.hap”模塊,則需要在模塊的“build.gradle”文件的“ohos”節(jié)點(diǎn)中添加以下配置:
     compileOptions{            annotationEnabled true    } 

  • 如果使用注解處理器的模塊為“com.huawei.ohos.library”模塊,則需要在模塊的“build.gradle”文件的“dependencies”節(jié)點(diǎn)中配置注解處理器。查看“orm_annotations_java.jar”、“orm_annotations_processor_java.jar” 、“javapoet_java.jar”

這3個(gè) jar 包在 HUAWEI SDK 中的對(duì)應(yīng)目錄,并將目錄的這三個(gè) jar 包導(dǎo)進(jìn)來(lái)。

     dependencies {
         compile files("orm_annotations_java.jar 的路徑","orm_annotations_processor_java.jar 的路徑","javapoet_java.jar 的路徑")
         annotationProcessor files("orm_annotations_java.jar 的路徑","orm_annotations_processor_java.ja 的路徑","javapoet_java.jar 的路徑")
     }

  • 如果使用注解處理器的模塊為“java-library”模塊,則需要在模塊的“build.gradle”文件的“dependencies”節(jié)點(diǎn)中配置注解處理器,并導(dǎo)入“ohos.jar”。
     dependencies {
         compile files("ohos.jar 的路徑","orm_annotations_java.jar 的路徑","orm_annotations_processor_java.jar 的路徑","javapoet_java.jar 的路徑")     
         annotationProcessor files("orm_annotations_java.jar 的路徑","orm_annotations_processor_java.jar 的路徑","javapoet_java.jar 的路徑")
     }

  1. 構(gòu)造數(shù)據(jù)庫(kù),即創(chuàng)建數(shù)據(jù)庫(kù)類(lèi)并配置對(duì)應(yīng)的屬性。

例如,定義了一個(gè)數(shù)據(jù)庫(kù)類(lèi) BookStore.java,數(shù)據(jù)庫(kù)包含了“User”,"Book","AllDataType"三個(gè)表,版本號(hào)為 “1”。數(shù)據(jù)庫(kù)類(lèi)的 getVersion 方法和 getHelper 方法不需要實(shí)現(xiàn),直接將數(shù)據(jù)庫(kù)類(lèi)設(shè)為虛類(lèi)即可。

   @Database(entities = {User.class, Book.class, AllDataType.class}, version = 1) 
   public abstract class BookStore extends OrmDatabase { 
   }

  1. 構(gòu)造數(shù)據(jù)表,即創(chuàng)建數(shù)據(jù)庫(kù)實(shí)體類(lèi)并配置對(duì)應(yīng)的屬性(如對(duì)應(yīng)表的主鍵,外鍵等)。數(shù)據(jù)表必須與其所在的數(shù)據(jù)庫(kù)在同一個(gè)模塊中。

例如,定義了一個(gè)實(shí)體類(lèi) User.java,對(duì)應(yīng)數(shù)據(jù)庫(kù)內(nèi)的表名為“user”;indices 為“firstName”和“l(fā)astName”兩個(gè)字段建立了復(fù)合索引“name_index”,并且索引值是唯一的;“ignoreColumns”表示該字段不需要添加到“user”表的屬性中。

   @Entity(tableName = "user", ignoredColumns = {"ignoreColumn1", "ignoreColumn2"},
       indices = {@Index(value = {"firstName", "lastName"}, name = "name_index", unique = true)}) 
   public class User extends OrmObject { 
       // 此處將userId設(shè)為了自增的主鍵。注意只有在數(shù)據(jù)類(lèi)型為包裝類(lèi)型時(shí),自增主鍵才能生效。
       @PrimaryKey(autoGenerate = true) 
       private Integer userId;   
       private String firstName;   
       private String lastName;   
       private int age;   
       private double balance;   
       private int ignoreColumn1; 
       private int ignoreColumn2; 

    
       // 開(kāi)發(fā)者自行添加字段的getter和setter 方法。 
   }

說(shuō)明

示例中的 getter & setter 的方法名為小駝峰格式,除了手寫(xiě)方法,IDE 中包含自動(dòng)生成 getter 和setter 方法的 Generate 插件。

  • 當(dāng)變量名的格式類(lèi)似“firstName”時(shí),getter 和 setter 方法名應(yīng)為“getFirstName”和“setFirstName”。
  • 當(dāng)變量名的格式類(lèi)似“mAge”,即第一個(gè)字母小寫(xiě),第二個(gè)字母大寫(xiě)的格式時(shí),getter 和 setter 方法名應(yīng)為“getmAge”和“setmAge”。
  • 當(dāng)變量名格式類(lèi)似“x”,即只有一個(gè)字母時(shí), getter 和 setter 方法名應(yīng)為“getX”和“setX”。

變量為 boolean 類(lèi)型時(shí),上述規(guī)則仍然成立,即“isFirstName”,“ismAge”,“isX”。

  1. 使用對(duì)象數(shù)據(jù)操作接口 OrmContext 創(chuàng)建數(shù)據(jù)庫(kù)。

例如,通過(guò)對(duì)象數(shù)據(jù)操作接口 OrmContext,創(chuàng)建一個(gè)別名為“BookStore”,數(shù)據(jù)庫(kù)文件名為“BookStore.db”的數(shù)據(jù)庫(kù)。如果數(shù)據(jù)庫(kù)已經(jīng)存在,執(zhí)行以下代碼不會(huì)重復(fù)創(chuàng)建。通過(guò) context.getDatabaseDir()可以獲取創(chuàng)建的數(shù)據(jù)庫(kù)文件所在的目錄。

   DatabaseHelper helper = new DatabaseHelper(context); // context入?yún)㈩?lèi)型為ohos.app.Context,注意不要使用slice.getContext()來(lái)獲取context,請(qǐng)直接傳入slice,否則會(huì)出現(xiàn)找不到類(lèi)的報(bào)錯(cuò)。
   OrmContext context = helper.getOrmContext("BookStore", "BookStore.db", BookStore.class); 

  1. (可選)數(shù)據(jù)庫(kù)升降級(jí)。如果開(kāi)發(fā)者有多個(gè)版本的數(shù)據(jù)庫(kù),通過(guò)設(shè)置數(shù)據(jù)庫(kù)版本遷移類(lèi)可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)版本升降級(jí)。

數(shù)據(jù)庫(kù)版本升降級(jí)的調(diào)用示例如下。其中 BookStoreUpgrade 類(lèi)也是一個(gè)繼承了 OrmDatabase 的數(shù)據(jù)庫(kù)類(lèi),與 BookStore 類(lèi)的區(qū)別在于配置的版本號(hào)不同。

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

TestOrmMigration12 的實(shí)現(xiàn)示例如下:

   private static class TestOrmMigration12 extends OrmMigration {
       // 此處用于配置數(shù)據(jù)庫(kù)版本遷移的開(kāi)始版本和結(jié)束版本,super(startVersion, endVersion)即數(shù)據(jù)庫(kù)版本號(hào)從1升到2。
       public TestOrmMigration12() {super(1, 2); }
       @Override    
       public void onMigrate(RdbStore store) {        
           store.executeSql("ALTER TABLE `Book` ADD COLUMN `addColumn12` INTEGER");   
       }
   }

說(shuō)明

數(shù)據(jù)庫(kù)版本遷移類(lèi)的起始版本和結(jié)束版本必須是連續(xù)的。

  • 如果 BookStoreUpgrad e類(lèi)的版本號(hào)配置為“2”,而當(dāng)前 BookStore.db 的實(shí)際版本號(hào)為“1”時(shí),TestOrmMigration12 類(lèi)的 onMigrate 方法會(huì)自動(dòng)被調(diào)用。開(kāi)發(fā)者可在 onMigrate 方法中填寫(xiě)升級(jí)需要執(zhí)行的 sql 語(yǔ)句。
  • 如果 BookStoreUpgrade 的類(lèi)版本號(hào)配置為“3”,而當(dāng)前 BookStore.db 的實(shí)際版本號(hào)為“1”時(shí),TestOrmMigration12, TestOrmMigration23 的 onMigrate 方法會(huì)自動(dòng)被調(diào)用完成數(shù)據(jù)庫(kù)升級(jí)。數(shù)據(jù)庫(kù)版本降級(jí)同理。
  1. 使用對(duì)象數(shù)據(jù)操作接口 OrmContext 對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查、注冊(cè)觀察者、備份數(shù)據(jù)庫(kù)等。
  • 增加數(shù)據(jù)。例如,在數(shù)據(jù)庫(kù)的名為“user”的表中,新建一個(gè) User 對(duì)象并設(shè)置對(duì)象的屬性。直接傳入 OrmObject 對(duì)象的增加接口,只有在 flush() 接口被調(diào)用后才會(huì)持久化到數(shù)據(jù)庫(kù)中。
     User user = new User(); 
     user.setFirstName("Zhang"); 
     user.setLastName("San"); 
     user.setAge(29); 
     user.setBalance(100.51); 
     boolean isSuccessed = context.insert(user); 
     isSuccessed = context.flush(); 

  • 更新或刪除數(shù)據(jù),分為兩種情況:
  • 通過(guò)直接傳入 OrmObject 對(duì)象的接口來(lái)更新數(shù)據(jù),需要先從表中查到需要更新的 User 對(duì)象列表,然后修改對(duì)象的值,再調(diào)用更新接口持久化到數(shù)據(jù)庫(kù)中。刪除數(shù)據(jù)與更新數(shù)據(jù)的方法類(lèi)似,只是不需要更新對(duì)象的值。

例如,更新“user”表中age為“29”的行,需要先查找“user”表中對(duì)應(yīng)數(shù)據(jù),得到一個(gè) User 的列表。然后選擇列表中需要更新的 User 對(duì)象(如第 0 個(gè)對(duì)象),設(shè)置需要更新的值,并調(diào)用 update 接口傳入被更新的 User 對(duì)象。最后調(diào)用 flush 接口持久化到數(shù)據(jù)庫(kù)中。

       // 更新數(shù)據(jù)
       OrmPredicates predicates = context.where(User.class);
       predicates.equalTo("age",29);
       List users = context.query(predicates);
       User user = users.get(0);
       user.setFirstName("Li");
       context.update(user);
       context.flush();

        
       // 刪除數(shù)據(jù)
       OrmPredicates predicates = context.where(User.class);
       predicates.equalTo("age",29);
       List users = context.query(predicates);
       User user = users.get(0);
       context.delete(user);
       context.flush();

  • 通過(guò)傳入謂詞的接口來(lái)更新和刪除數(shù)據(jù),方法與 OrmObject 對(duì)象的接口類(lèi)似,只是無(wú)需 flush 就可以持久化到數(shù)據(jù)庫(kù)中。
       ValuesBucket valuesBucket = new ValuesBucket();
       valuesBucket.putInteger("age", 31);
       valuesBucket.putString("firstName", "ZhangU");
       valuesBucket.putString("lastName", "SanU");
       valuesBucket.putDouble("balance", 300.51);
       OrmPredicates update = context.where(User.class).equalTo("userId", 1);
       context.update(update, valuesBucket);

  • 查詢(xún)數(shù)據(jù)。在數(shù)據(jù)庫(kù)的“user”表中查詢(xún)lastName為“San”的 User 對(duì)象列表,示例如下:
     OrmPredicates query = context.where(User.class).equalTo("lastName", "San"); 
     List users = context.query(query);

  • 注冊(cè)觀察者。
     // 定義一個(gè)觀察者類(lèi)。
     private class MyOrmObjectObserver implements OrmObjectObserver {
         @Override    
         public void onChange(OrmContext changeContext,AllChangeToTarget subAllChange {
             // 用戶(hù)可以在此處定義觀察者行為
         }
     }

      
     // 調(diào)用registerEntityObserver方法注冊(cè)一個(gè)觀察者observer。
     MyOrmObjectObserver observer = new MyOrmObjectObserver();
     context.registerEntityObserver("user", observer);

      
     // 當(dāng)以下方法被調(diào)用,并flush成功時(shí),觀察者observer的onChange方法會(huì)被觸發(fā)。其中,方法的入?yún)⒈仨殲閁ser類(lèi)的對(duì)象。
     public  boolean insert(T object)
     public  boolean update(T object)
     public  boolean delete(T object)

  • 備份數(shù)據(jù)庫(kù)。其中原數(shù)據(jù)庫(kù)名為“OrmBackUp.db”,備份數(shù)據(jù)庫(kù)名為“OrmBackup001.db”。
     OrmContext context = helper.getObjectContext("OrmBackup", "OrmBackup.db", BookStore.class);
     context.backup("OrmBackup001.db");
     context.close();

  1. 刪除數(shù)據(jù)庫(kù),例如刪除 OrmBackup.db。
   helper.deleteRdbStore("OrmBackup.db");

網(wǎng)站欄目:創(chuàng)新互聯(lián)鴻蒙OS教程:鴻蒙OS對(duì)象關(guān)系映射數(shù)據(jù)庫(kù)開(kāi)發(fā)指導(dǎo)
轉(zhuǎn)載來(lái)于:http://m.5511xx.com/article/djgpcsd.html