精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

【鴻蒙開發】開發筆記-對象關系映射數據庫

開發 前端
HarmonyOS對象關系映射(Object Relational Mapping,ORM)數據庫是一款基于SQLite的數據庫框架,屏蔽了底層SQLite數據庫的SQL操作,針對實體和關系提供了增刪改查等一系列的面向對象接口。

[[434593]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

一、前言

剛學習了對象關系映射數據庫,覺得這個數據庫很實用,所以想把學習到的記錄下來,通過文章讓自己的學習記憶更深刻。社區里很多關于這個的文章,但是我還是想寫一個我自己的。把我自己的理解寫出來,讓社區的大佬們看一下我有沒有哪些理解錯誤,可以批評指正。

二、概念

HarmonyOS對象關系映射(Object Relational Mapping,ORM)數據庫是一款基于SQLite的數據庫框架,屏蔽了底層SQLite數據庫的SQL操作,針對實體和關系提供了增刪改查等一系列的面向對象接口。應用開發者不必再去編寫復雜的SQL語句, 以操作對象的形式來操作數據庫,提升效率的同時也能聚焦于業務開發。

以上是官方文檔對這個數據庫的描述,我的理解是,這是一個可以存對象的數據庫。在關系型數據庫的基礎上,再增加對象這種類型。關系型數據庫只能存基礎類型,在實際開發中,我們經常會與服務器進行交互。服務器返回json字符串,之前Android有工具可以轉成實體類,鴻蒙暫時沒看到,但是可以在網上搜索json轉實體類,就可以進行json轉實體類。

#星光計劃1.0#【鴻蒙開發】開發筆記-對象關系映射數據庫-鴻蒙HarmonyOS技術社區
#星光計劃1.0#【鴻蒙開發】開發筆記-對象關系映射數據庫-鴻蒙HarmonyOS技術社區

在沒有學習到對象關系映射數據庫之前,我要把一個服務器返回的實體類信息進行存儲,就需要把返回的實體類再分解為一個個字段,比如下面Person類。

  1. public class Person { 
  2.     Integer id; 
  3.     String name
  4.     String gender; 
  5.     String age; 

 如果按關系型數據庫來寫的話是這樣的:

  1. private static final String DB_COLUMN_PERSON_ID = "id"
  2.  
  3.  private static final String DB_COLUMN_NAME = "name"
  4.  
  5.  private static final String DB_COLUMN_GENDER = "gender"
  6.  
  7.  private static final String DB_COLUMN_AGE = "age"

 如果類字段少還好,如果多就會很費時間,開發講究效率。那如果是對象型數據庫是怎么寫呢,接下來我把這個例子通過對比的方式,讓大家看看對象關系映射數據庫的實用之處。

三、創建數據庫

1.開發數據庫,首先要創建數據庫,如果是關系型數據庫,那創建的時候是這么寫的:

a.配置數據庫相關信息,包括數據庫的名稱、存儲模式、是否為只讀模式等。

  1. private static final String DB_NAME = "persondataability.db";//數據庫名稱 
  2.  
  3. private static final String DB_TAB_NAME = "person";//表的名稱 
  4.  
  5. private static final String DB_COLUMN_PERSON_ID = "id";//字段id 
  6.  
  7. private static final String DB_COLUMN_NAME = "name";//字段name 
  8.  
  9. private static final String DB_COLUMN_GENDER = "gender";//字段gender 
  10.  
  11. private static final String DB_COLUMN_AGE = "age";//字段age 
  12.  
  13. private static final int DB_VERSION = 1;//數據庫版本號 
  14.  
  15. private StoreConfig storeConfig = StoreConfig.newDefaultConfig(DB_NAME);//配置數據庫名稱 
  16. private RdbStore rdbStore; 

 b.初始化數據庫表結構和相關數據。

  1. private RdbOpenCallback rdbOpenCallback = new RdbOpenCallback() { 
  2.        @Override 
  3.        public void onCreate(RdbStore rdbStore) { 
  4.            //數據庫創建時被回調,開發者可以在該方法中初始化表結構,并添加一些應用使用到的初始化數據。 
  5.            rdbStore.executeSql("create table if not exists " 
  6.                    + DB_TAB_NAME + " (" 
  7.                    + DB_COLUMN_PERSON_ID +" integer primary key," 
  8.                    + DB_COLUMN_NAME + " text not null," 
  9.                    + DB_COLUMN_GENDER + " text not null," 
  10.                    + DB_COLUMN_AGE + " integer)"); 
  11.        } 
  12.  
  13.        @Override 
  14.        public void onUpgrade(RdbStore rdbStore, int i, int i1) { 
  15.           //數據庫升級時被回調 
  16.        } 
  17.    }; 

 c.創建數據庫。

  1. DatabaseHelper databaseHelper = new DatabaseHelper(this);//DatabaseHelper是數據庫操作的輔助類,當數據庫創建成功后, 
  2. // 數據庫文件將存儲在由上下文指定的目錄里。數據庫文件存儲的路徑會因指定不同的上下文存在差異。 
  3. rdbStore = databaseHelper.getRdbStore(storeConfig,DB_VERSION,rdbOpenCallback,null);//根據配置創建或打開數據庫。 

 2.如果是對象關系型數據庫,寫法就簡單很多,如下:

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

屬性:

  • version:數據庫版本號。
  • entities:數據庫內包含的表。
  1. @Database(entities = {Person.class},version = 1) 
  2. public abstract class PersonOrm extends OrmDatabase { 

 這里有個小小的坑,有些同學會出現如下問題:

#星光計劃1.0#【鴻蒙開發】開發筆記-對象關系映射數據庫-鴻蒙HarmonyOS技術社區

這里報錯提示Cannot resolve symbol ‘Database’,那是因為我們沒有添加一個配置,在當前模塊進行配置。

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

注意,這里必須添加在當前模塊的build.gradle文件,如果是項目的build.gradle文件就沒效果,添加后要進行同步,同步按鈕在右上角Sync Now。

  1. compileOptions{         
  2.     annotationEnabled true     
  3. }  

這樣就不會報錯了。

b.創建數據表。開發者可通過創建一個繼承了OrmObject并用@Entity注解的類,獲取數據庫實體對象,也就是表的對象。

屬性:

  • tableName:表名。
  • primaryKeys:主鍵名,一個表里只能有一個主鍵,一個主鍵可以由多個字段組成。
  • foreignKeys:外鍵列表。
  • indices:索引列表。
#星光計劃1.0#【鴻蒙開發】開發筆記-對象關系映射數據庫-鴻蒙HarmonyOS技術社區

在上面提到的Person.class,其實就是我們本來用來解析服務器json數據所創建的實體類,如果要用來存儲數據庫,作為數據庫的表,就需要進行一定的修改,修改如下:

  1. @Entity(tableName = "person")//設置表的名稱 
  2. public class Person extends OrmObject { 
  3.     @PrimaryKey()//把id作為主鍵 
  4.     Integer id; 
  5.     String name
  6.     String gender; 
  7.     String age; 
  8.  
  9.     public Integer getId() { 
  10.         return id; 
  11.     } 
  12.  
  13.     public void setId(Integer id) { 
  14.         this.id = id; 
  15.     } 
  16.  
  17.     public String getName() { 
  18.         return name
  19.     } 
  20.  
  21.     public void setName(String name) { 
  22.         this.name = name
  23.     } 
  24.  
  25.     public String getGender() { 
  26.         return gender; 
  27.     } 
  28.  
  29.     public void setGender(String gender) { 
  30.         this.gender = gender; 
  31.     } 
  32.  
  33.     public String getAge() { 
  34.         return age; 
  35.     } 
  36.  
  37.     public void setAge(String age) { 
  38.         this.age = age; 
  39.     } 

以上是簡單版本的實體類修改為數據庫實體對象,也就是表的對象,鴻蒙還提供了幾個實用的技巧,比如:

1.我們服務器返回的字段,不一定要存入數據庫,可以用"ignoredColumns"表示該字段不加入表的屬性。

2.我們有時候需要兩個字段合起來進行查詢,比如姓和名進行復合索引,那么可以用"indices"建立復合索引。

3.設置自增的主鍵,這個也是數據庫一般都需要的。

在本文例子中,我們添加幾個字段用來展示上面說的技巧,示例如下:

  1. @Entity(tableName = "person",//設置表的名稱 
  2.         ignoredColumns = {"address"},//設置不加入表的屬性字段 
  3.         indices = {@Index(value = {"firstName","lastName"},name = "name_index",unique = true)}) 
  4.         //indices 為“firstName”和“lastName”兩個字段建立了復合索引“name_index”,并且索引值是唯一的 
  5. public class Person extends OrmObject { 
  6.     @PrimaryKey(autoGenerate = true)//把id設為了自增的主鍵。注意只有在數據類型為包裝類型時,自增主鍵才能生效 
  7.     Integer id; 
  8.     String name
  9.     String gender; 
  10.     String age; 
  11.     String firstName; 
  12.     String lastName; 
  13.     String address;//不加入表的屬性 
  14.  
  15.     public Integer getId() { 
  16.         return id; 
  17.     } 
  18.  
  19.     public void setId(Integer id) { 
  20.         this.id = id; 
  21.     } 
  22.  
  23.     public String getName() { 
  24.         return name
  25.     } 
  26.  
  27.     public void setName(String name) { 
  28.         this.name = name
  29.     } 
  30.  
  31.     public String getGender() { 
  32.         return gender; 
  33.     } 
  34.  
  35.     public void setGender(String gender) { 
  36.         this.gender = gender; 
  37.     } 
  38.  
  39.     public String getAge() { 
  40.         return age; 
  41.     } 
  42.  
  43.     public void setAge(String age) { 
  44.         this.age = age; 
  45.     } 
  46.  
  47.     public String getFirstName() { 
  48.         return firstName; 
  49.     } 
  50.  
  51.     public void setFirstName(String firstName) { 
  52.         this.firstName = firstName; 
  53.     } 
  54.  
  55.     public String getLastName() { 
  56.         return lastName; 
  57.     } 
  58.  
  59.     public void setLastName(String lastName) { 
  60.         this.lastName = lastName; 
  61.     } 
  62.  
  63.     public String getAddress() { 
  64.         return address; 
  65.     } 
  66.  
  67.     public void setAddress(String address) { 
  68.         this.address = address; 
  69.     } 

c.使用對象數據操作接口OrmContext創建數據庫。

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

  1. // context入參類型為ohos.app.Context,注意不要使用slice.getContext()來獲取context,請直接傳入slice,否則會出現找不到類的報錯。 
  2.   DatabaseHelper databaseHelper = new DatabaseHelper(this); 
  3.   //數據庫別名為“PersonStore”,數據庫文件名稱為“PersonStore.db”,最后傳入的是繼承OrmDatabase的數據庫類,這里我一開始寫錯了,以為是實體類。希望沒人跟我一樣笨 
  4.   OrmContext context = databaseHelper.getOrmContext("PersonStore","PersonStore.db", PersonOrm.class); 

以上就是對象關系映射數據庫的創建過程,是不是比關系型數據庫要簡單一點呢。數據庫創建好了,就需要進行增刪改查的操作了,接下來我把關系型數據庫和對象關系映射數據庫的增刪改查都對比一下。為了方便大家對比和學習,大家可以通過目錄快速查找你想看的內容哦。

四、增加數據

1.關系型數據庫

封裝了一個插入數據的方法,用于調用。

  1. /*** 
  2.     * 向數據庫插入數據。 
  3.     * @param uri  數據庫的路徑,傳入路徑,用于判斷是否是正確的數據庫 
  4.     * @param value 以ValuesBucket存儲的待插入的數據。它提供一系列put方法,如putString(String columnName, String values),putDouble(String columnName, double value),用于向ValuesBucket中添加數據。 
  5.     * @return 
  6.     */ 
  7.    @Override 
  8.    public int insert(Uri uri, ValuesBucket value) { 
  9.        HiLog.info(LABEL_LOG, "DataAbility insert"); 
  10.        String path = uri.getLastPath(); 
  11.        if (!"person".equals(path)){ 
  12.            HiLog.info(LABEL_LOG,"DataAbility insert path is not matched"); 
  13.            return -1; 
  14.        } 
  15.        ValuesBucket valuesBucket = new ValuesBucket(); 
  16.        valuesBucket.putInteger(DB_COLUMN_PERSON_ID,value.getInteger(DB_COLUMN_PERSON_ID)); 
  17.        valuesBucket.putString(DB_COLUMN_NAME, value.getString(DB_COLUMN_NAME)); 
  18.        valuesBucket.putString(DB_COLUMN_GENDER,value.getString(DB_COLUMN_GENDER)); 
  19.        valuesBucket.putInteger(DB_COLUMN_AGE,value.getInteger(DB_COLUMN_AGE)); 
  20.        int index = (int) rdbStore.insert(DB_TAB_NAME,valuesBucket);//插入數據,第一個參數是數據庫的表名,第二個是數據 
  21.        DataAbilityHelper.creator(this,uri).notifyChange(uri);//通知數據庫更新 
  22.        return index
  23.    } 

 2.對象關系映射數據庫

當數據庫有變化時,關系型數據庫通過DataAbilityHelper.creator(this,uri).notifyChange(uri);通知數據庫更新,uri為數據庫的路徑。那對象關系映射數據庫通過什么通知更新呢?通過注冊觀察者。

通過使用對象數據操作接口,開發者可以在某些數據上設置觀察者,接收數據變化的通知。

#星光計劃1.0#【鴻蒙開發】開發筆記-對象關系映射數據庫-鴻蒙HarmonyOS技術社區
  1. // 定義一個觀察者類。 
  2.  private class CustomedOrmObjectObserver implements OrmObjectObserver { 
  3.      @Override 
  4.      public void onChange(OrmContext changeContext, AllChangeToTarget subAllChange) { 
  5.          // 用戶可以在此處定義觀察者行為 
  6.      } 
  7.  } 

 用法:

  1. CustomedOrmObjectObserver observer = new CustomedOrmObjectObserver(); 
  2.      context.registerEntityObserver("Person", observer); // 調用registerEntityObserver方法注冊一個觀察者observer 
  3.      context.close();//不需要的時候及時關閉 
  1. // 當以下方法被調用,并flush成功時,觀察者observer的onChange方法會被觸發。其中,方法的入參必須為Person類的對象。 
  2. public <T extends OrmObject> boolean insert(T object) 
  3. public <T extends OrmObject> boolean update(T object) 
  4. public <T extends OrmObject> boolean delete(T object) 

回到增加數據上來,對象關系映射數據庫增加數據方法如下:

  1. private void insert(){ 
  2.         Person person = new Person(); 
  3.         person.setName("lili"); 
  4.         person.setAge("12"); 
  5.         person.setGender("女"); 
  6.         OrmContext ormContext = databaseHelper.getOrmContext(DB_ALIAS,DB_NAME,PersonOrm.class); 
  7.         if (ormContext.insert(person)){ 
  8.             //說明插入成功 
  9.         }else { 
  10.             //說明插入失敗 
  11.         } 
  12.         ormContext.registerContextObserver(ormContext,observer); 
  13.         ormContext.flush(); 
  14.         ormContext.close(); 
  15.     } 

這個增加數據是不是比關系型數據庫要簡單一點呢?而且也比較符合我們的代碼習慣,直接把實體對象賦值,傳入就可以了。

五、查詢數據

1.關系型數據庫

a.構造用于查詢的謂詞對象,設置查詢條件。

b.指定查詢返回的數據列。

c.調用查詢接口查詢數據。

d.調用結果集接口,遍歷返回結果

這里官網給的例子是以下這樣的:

  1. String[] columns = new String[] {"id""name""age""salary"};  //構造用于查詢的謂詞對象 
  2.     RdbPredicates rdbPredicates = new RdbPredicates("test").equalTo("age", 25).orderByAsc("salary");//設置查詢條件,指定查詢返回的數據列 
  3.     ResultSet resultSet = store.query(rdbPredicates, columns);//調用查詢接口查詢數據 
  4.     resultSet.goToNextRow();//調用結果集接口,遍歷返回結果 

但是實際應用中,我們一般把關系型數據庫的代碼寫在DataAbility里面,所以這邊查詢封裝的代碼如下:

  1. /*** 
  2.      * 
  3.      * @param uri   數據庫的地址 
  4.      * @param columns 構造用于查詢的謂詞對象 
  5.      * @param predicates  查詢條件 
  6.      * @return  返回結果集 
  7.      */ 
  8.     @Override 
  9.     public ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) { 
  10.         RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates,DB_TAB_NAME);//構造查詢條件 
  11.         ResultSet resultSet = rdbStore.query(rdbPredicates,columns);//調用查詢接口 
  12.         if (resultSet == null){ 
  13.             HiLog.info(LABEL_LOG,"resultSet is null"); 
  14.         } 
  15.         return resultSet; 
  16.     } 

 那我們要怎么調用呢?調用如下:

  1. private void query() { 
  2.     String[] columns = new String[] {DB_COLUMN_PERSON_ID, 
  3.             DB_COLUMN_NAME, DB_COLUMN_GENDER, DB_COLUMN_AGE}; 
  4.     // 構造查詢條件 
  5.     DataAbilityPredicates predicates = new DataAbilityPredicates(); 
  6.     predicates.between(DB_COLUMN_AGE, 15, 40);//構造查詢條件 
  7.     try { 
  8.         ResultSet resultSet = databaseHelper.query(Uri.parse(BASE_URI + DATA_PATH), 
  9.                 columns, predicates);//調用封裝方法 
  10.         if (resultSet == null || resultSet.getRowCount() == 0) { 
  11.             HiLog.info(LABEL_LOG, "query: resultSet is null or no result found"); 
  12.             return
  13.         } 
  14.         resultSet.goToFirstRow();//回到結果第一行 
  15.         do {//開始遍歷結果 
  16.             int id = resultSet.getInt(resultSet.getColumnIndexForName(DB_COLUMN_PERSON_ID)); 
  17.             String name = resultSet.getString(resultSet.getColumnIndexForName(DB_COLUMN_NAME)); 
  18.             String gender = resultSet.getString(resultSet.getColumnIndexForName(DB_COLUMN_GENDER)); 
  19.             int age = resultSet.getInt(resultSet.getColumnIndexForName(DB_COLUMN_AGE)); 
  20.             HiLog.info(LABEL_LOG, "query: Id :" + id + " Name :" + name + " Gender :" + gender + " Age :" + age); 
  21.         } while (resultSet.goToNextRow()); 
  22.     } catch (DataAbilityRemoteException | IllegalStateException exception) { 
  23.         HiLog.error(LABEL_LOG, "query: dataRemote exception | illegalStateException"); 
  24.     } 

 2.對象關系映射數據庫

  1. private void query() { 
  2.         OrmContext ormContext = databaseHelper.getOrmContext(DB_ALIAS,DB_NAME,PersonOrm.class); 
  3.         OrmPredicates query = ormContext.where(Person.class).equalTo("name""San"); 
  4.         List<Person> persons = ormContext.query(query); 
  5.         ormContext.flush(); 
  6.         ormContext.close(); 
  7.         if (persons.size() == 0) { 
  8.             return
  9.         } 
  10.         for (Person person : persons) { 
  11.             //循環輸出結果 
  12.         } 
  13.     } 

 對比起來,對象關系映射數據庫是不是更簡單呢?有種SQL語句的感覺哈哈

六、更新數據

1.關系型數據庫

  1. @Override 
  2.    public int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates) { 
  3.        RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates,DB_TAB_NAME); 
  4.        int index = rdbStore.update(value,rdbPredicates); 
  5.        HiLog.info(LABEL_LOG,"update:"index); 
  6.        DataAbilityHelper.creator(this,uri).notifyChange(uri); 
  7.        return index
  8.    } 

 怎么調用呢?

  1. private void update() { 
  2.       DataAbilityPredicates predicates = new DataAbilityPredicates(); 
  3.       predicates.equalTo(DB_COLUMN_PERSON_ID, 102); 
  4.       ValuesBucket valuesBucket = new ValuesBucket(); 
  5.       valuesBucket.putString(DB_COLUMN_NAME, "ZhangSanPlus"); 
  6.       valuesBucket.putInteger(DB_COLUMN_AGE, 28); 
  7.       try { 
  8.           if (databaseHelper.update(Uri.parse(BASE_URI + DATA_PATH), valuesBucket, predicates) != -1) { 
  9.               HiLog.info(LABEL_LOG, "update successful"); 
  10.           } 
  11.       } catch (DataAbilityRemoteException | IllegalStateException exception) { 
  12.           HiLog.error(LABEL_LOG, "update: dataRemote exception | illegalStateException"); 
  13.       } 
  14.   } 

 2.對象映射關系型數據庫

  1. private void update() { 
  2.       OrmContext ormContext = databaseHelper.getOrmContext(DB_ALIAS,DB_NAME,PersonOrm.class); 
  3.       OrmPredicates predicates = ormContext.where(Person.class); 
  4.       predicates.equalTo("age", 29); 
  5.       List<Person> persons = ormContext.query(predicates); 
  6.       if (persons.size() == 0) { 
  7.           new ToastDialog(this).setText("no data not update").show(); 
  8.           return
  9.       } 
  10.       Person user = persons.get(0); 
  11.       ormContext.registerObjectObserver(user, observer); 
  12.       user.setFirstName("Li"); 
  13.       if (ormContext.update(user)) { 
  14.          //更新成功 
  15.       } else { 
  16.           //更新失敗 
  17.       } 
  18.       ormContext.flush(); 
  19.       ormContext.close(); 
  20.       ormContext.unregisterObjectObserver(user, observer); 
  21.   } 

 上面例子提供了兩種更新的應用,根據查詢條件進行更新,或是指定某個數據項進行更新。

對比還是覺得對象映射關系型數據庫要簡單易懂一點。

七、刪除數據

1.關系型數據庫

  1. @Override 
  2.    public int delete(Uri uri, DataAbilityPredicates predicates) { 
  3.        RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates,DB_TAB_NAME); 
  4.        int index = rdbStore.delete(rdbPredicates); 
  5.        HiLog.info(LABEL_LOG,"delete"+index); 
  6.        DataAbilityHelper.creator(this,uri).notifyChange(uri); 
  7.        return index
  8.    } 

 調用方法:

  1. private void delete() { 
  2.         DataAbilityPredicates predicates = new DataAbilityPredicates() 
  3.                 .equalTo(DB_COLUMN_PERSON_ID, 100); 
  4.         try { 
  5.             if (databaseHelper.delete(Uri.parse(BASE_URI + DATA_PATH), predicates) != -1) { 
  6.                 HiLog.info(LABEL_LOG, "delete successful"); 
  7.             } 
  8.         } catch (DataAbilityRemoteException | IllegalStateException exception) { 
  9.             HiLog.error(LABEL_LOG, "delete: dataRemote exception | illegalStateException"); 
  10.         } 
  11.     } 

 2.對象映射關系數據庫

  1. private void delete() { 
  2.         OrmContext ormContext = databaseHelper.getOrmContext(DB_ALIAS,DB_NAME,PersonOrm.class); 
  3.         OrmPredicates predicates = ormContext.where(Person.class); 
  4.         predicates.equalTo("age", 29); 
  5.         List<Person> persons = ormContext.query(predicates); 
  6.         if (persons.size() == 0) { 
  7.             new ToastDialog(this).setText("no data not delete").show(); 
  8.             return
  9.         } 
  10.         Person person = persons.get(0); 
  11.         if (ormContext.delete(person)) { 
  12.             new ToastDialog(this).setText("delete success").show(); 
  13.         } else { 
  14.             new ToastDialog(this).setText("delete fail").show(); 
  15.         } 
  16.         ormContext.flush(); 
  17.         ormContext.close(); 
  18.     } 

八、小結

以上就是關于兩種數據庫類型的增刪改查,對比一下,對象映射關系型數據庫相對簡單易懂一些。關系型數據庫我覺得兩個重要的,一個是ValuesBucket 用來構建數據 value, 一個是DataAbilityPredicates 用來構建條件predicates。對象映射關系數據庫主要是在于實體類,比較符合我們和服務器交互的需要。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-09-03 15:41:00

鴻蒙HarmonyOS應用

2013-09-12 12:55:53

iOS開發

2021-09-03 15:27:17

鴻蒙HarmonyOS應用

2023-05-22 16:10:51

動態共享包數據庫

2022-08-15 22:09:37

設備開發開發筆記

2021-02-03 09:59:02

鴻蒙HarmonyOS應用開發

2011-08-22 15:43:08

IOS開發數據庫

2015-10-14 10:16:26

安安卓開發EventBus

2012-05-17 11:45:12

iPhone

2021-09-06 10:24:12

鴻蒙HarmonyOS應用

2013-03-28 10:22:33

數據庫關系型數據庫數據庫設計

2021-10-28 19:28:04

數據庫開發Spring

2022-08-09 07:57:25

Linux操作系統Windows

2009-09-23 13:26:10

Hibernate對象

2011-03-21 13:53:45

數據庫開發書寫規范

2011-08-02 16:16:08

iPhone開發 SQLite 數據庫

2009-04-16 09:08:21

Oracle開發經驗

2011-03-15 15:05:35

MySQL數據庫開發

2012-02-08 12:17:38

HibernateJava

2009-06-17 14:33:08

java項目開發
點贊
收藏

51CTO技術棧公眾號

水蜜桃一区二区三区| 日韩av大片在线| 国产裸体视频网站| 欧产日产国产精品视频| 久久综合狠狠综合久久综合88| 国产成人av在线| 色老板免费视频| 激情亚洲另类图片区小说区| 在线观看日韩av先锋影音电影院| 最近看过的日韩成人| 秋霞av鲁丝片一区二区| 日韩一区精品字幕| 欧美日韩爱爱视频| 欧美特级黄色录像| 在线观看视频一区二区三区| 91精品福利视频| 欧美大片免费播放| 黄色大片在线免费观看| 国产精品一区一区三区| 97人人爽人人喊人人模波多| 在线日韩国产网站| 台湾佬综合网| 精品少妇一区二区三区| 91制片厂毛片| 在线天堂资源www在线污| 亚洲免费成人av| 日本一区二区三区视频免费看| 亚洲国产视频一区二区三区| 蜜臀久久99精品久久久久宅男 | 91久久嫩草影院一区二区| 国产无码精品视频| 欧美 日韩 国产 一区| 揄拍成人国产精品视频| 日韩 中文字幕| 中文字幕久久精品一区二区| 91麻豆精品国产91久久久使用方法 | 欧美在线观看视频在线| 无码av天堂一区二区三区| 免费观看在线黄色网| 久久久久久久综合色一本| 国产精品theporn88| 国产又黄又粗又硬| 欧美aaaaaa午夜精品| 国产不卡av在线| 中日韩精品视频在线观看| 综合色一区二区| 中文字幕在线精品| 国产视频不卡在线| 欧美男gay| 亚洲色图15p| 朝桐光av一区二区三区| 中文字幕av一区二区三区四区| 欧美一卡在线观看| 激情久久综合网| 久久久久毛片免费观看| 欧美精品日韩一区| 亚洲制服中文字幕| 精品国产亚洲一区二区三区| 欧美一卡二卡在线观看| 久久久久久久久久久影视| 日韩一二三区| 日韩欧美国产wwwww| xxxx国产视频| 国产suv精品一区| 欧美精品一区二区三区久久久| yjizz视频| 日本亚洲不卡| 亚洲午夜小视频| 性少妇xx生活| 91成人看片| 欧美国产中文字幕| 日韩欧美一区二区一幕| 亚洲一区欧美激情| 国产精彩精品视频| 在线观看免费观看在线| 国产一区在线观看麻豆| 高清国产在线一区| 日本黄在线观看| 欧美激情中文字幕一区二区| 综合久久国产| 18video性欧美19sex高清| 欧美性猛交丰臀xxxxx网站| 黄色一级免费大片| 亚洲久草在线| 亚洲第一偷拍网| 亚洲一区视频在线播放| 91精品国产麻豆国产在线观看| 欧美第一黄网免费网站| 日韩av大片在线观看| 蜜桃久久av一区| 亚洲伊人一本大道中文字幕| 天堂av中文在线资源库| 国产精品久久久久久久久搜平片 | 国产传媒欧美日韩| 青春有你2免费观看完整版在线播放高清| 国产清纯白嫩初高生在线观看91| 日本美女爱爱视频| 中国字幕a在线看韩国电影| 欧美日韩精品高清| 在线xxxxx| 日韩精品影视| 456国产精品| 国产毛片毛片毛片毛片| 2023国产精品视频| 国风产精品一区二区| 亚洲第一av| 91精品国产aⅴ一区二区| 巨胸大乳www视频免费观看| 五月开心六月丁香综合色啪 | 337p亚洲精品色噜噜狠狠p| 这里有精品可以观看| 欧美一区二区在线免费观看| 中文字幕av网址| 亚洲视频日本| 成人黄色片在线| 男人天堂网在线观看| 亚洲精品欧美综合四区| 国产理论在线播放| 欧美大胆视频| 欧美人与性动交a欧美精品| 中文字幕有码视频| 久久综合九色综合欧美98| 大胆欧美熟妇xx| 色综合一区二区日本韩国亚洲| 亚洲精品永久免费精品| 精品一区二区三区四| 久久激情综合网| 日韩精彩视频| 电影一区二区三| 日韩精品视频在线观看免费| 久久久久亚洲av成人片| 国产麻豆欧美日韩一区| 亚洲欧洲精品一区二区三区波多野1战4 | 国产精品系列在线| 免费观看成人在线视频| 日韩三级视频| 97视频在线观看播放| 成人av一区二区三区在线观看| 国产精品久久久久久久岛一牛影视| 国产91对白刺激露脸在线观看| 欧美精品中文字幕亚洲专区| 欧美国产极速在线| 亚洲成人av综合| 一区二区在线观看免费视频播放 | 国产微拍精品一区| 成人av免费观看| 九九爱精品视频| 欧美日韩大片免费观看| 久久免费视频这里只有精品| 成人精品在线播放| 午夜欧美在线一二页| 极品白嫩的小少妇| 精品动漫3d一区二区三区免费| 97中文在线观看| 国产黄色大片在线观看| 亚洲风情亚aⅴ在线发布| 国产黄色片视频| 91亚洲国产成人精品一区二三| 波多野结衣乳巨码无在线| 丝袜美腿一区二区三区动态图| 4438全国成人免费| 成人性爱视频在线观看| 欧美无乱码久久久免费午夜一区| wwwww黄色| 精品亚洲porn| 国产片侵犯亲女视频播放| 国产成人福利av| 欧美性资源免费| 国产视频网址在线| 欧美日韩高清一区| 九九九久久久久| 波多野结衣在线一区| www.四虎成人| 色综合色综合| 国产精品初高中精品久久| 中文在线8资源库| 中文字幕久久久av一区| 国产乱色精品成人免费视频| 亚洲一区二区av在线| 日韩一级视频在线观看| 免费看欧美美女黄的网站| 99久re热视频精品98| 成人性生交大片免费看96| 日韩av电影院| 国产色在线观看| 亚洲第一网站男人都懂| 国产在线观看第一页| 亚洲天堂av一区| 黄色性生活一级片| 蜜桃精品在线观看| a级黄色一级片| 久久精品99久久无色码中文字幕| 51成人做爰www免费看网站| 麻豆国产在线| 日韩视频亚洲视频| 五月天激情婷婷| 欧美另类z0zxhd电影| 国产精品suv一区二区| 欧美极品少妇xxxxⅹ高跟鞋| 少妇伦子伦精品无吗| 日韩高清电影一区| 男人天堂手机在线视频| 日本一区二区高清不卡| 精品免费视频123区| 91麻豆精品| 国产mv久久久| yellow在线观看网址| 日韩在线播放av| 四虎在线视频| 欧美日产在线观看| 天堂а√在线中文在线新版| 亚洲欧美日韩在线不卡| 中文字幕免费高清| 99麻豆久久久国产精品免费优播| 中文字幕 欧美日韩| 波多野结衣家庭主妇| 丰满岳乱妇国产精品一区| 亚洲一本大道在线| 国精品人伦一区二区三区蜜桃| 99国内精品久久| 9191在线视频| 捆绑调教美女网站视频一区| 777米奇影视第四色| 国精品一区二区三区| 欧美爱爱视频网站| 欧美日韩高清| 欧美视频小说| 欧美自拍视频| 国产一区二区三区高清视频| 日韩成人久久| 91精品一区二区| 伊人久久大香线蕉综合影院首页| 国产成人免费av电影| 一区二区乱码| 91高清视频免费观看| 96av在线| 91tv亚洲精品香蕉国产一区7ujn| 欧美日韩在线视频免费观看| 久久av.com| av免费在线观看网站| 久久久国产精品亚洲一区| 91吃瓜网在线观看| 色小说视频一区| 免费人成在线观看播放视频| 北条麻妃久久精品| 男人在线资源站| xxav国产精品美女主播| 欧美日本高清| 久久精品福利视频| caoporm免费视频在线| 久久国产精品首页| 牛牛精品视频在线| 97在线视频免费| 午夜影院在线播放| 国产精品久久久av| 国产成人精品一区二区三区在线 | av网站免费线看精品| 99久久免费看精品国产一区| 99视频超级精品| 性欧美丰满熟妇xxxx性仙踪林| 久久女同精品一区二区| 91成人在线免费视频| 国产精品久久久爽爽爽麻豆色哟哟 | 欧美激情精品久久久久久蜜臀| 午夜小视频在线观看| 性欧美暴力猛交69hd| 免费亚洲电影| 国产精品永久免费观看| 日本在线一区二区三区| 精品综合在线| 精品视频久久| 无码人妻精品一区二区三区99v| 国产精品v亚洲精品v日韩精品 | 色播亚洲视频在线观看| 婷婷综合亚洲| 奇米影视亚洲色图| 丝袜美腿成人在线| 国产欧美激情视频| 成人精品视频.| 欧洲av一区二区三区| 自拍偷拍亚洲综合| 日韩免费一级片| 欧美在线一二三四区| 99热在线只有精品| 精品调教chinesegay| 亚洲视频tv| 91国内精品久久| 成人av在线播放| 久精品国产欧美| 天天做天天爱天天综合网| 人人妻人人做人人爽| 日韩电影在线观看电影| 免费黄视频在线观看| 久久久www免费人成精品| 国产女人18水真多毛片18精品| 欧美午夜精品在线| 国产麻豆一精品一男同| 亚洲图片在线综合| 国产天堂在线播放视频| 国产精品你懂得| 麻豆精品99| 四虎4hu永久免费入口| 日一区二区三区| 精品影片一区二区入口| 亚洲欧美色图小说| 影音先锋在线国产| 日韩女优电影在线观看| 成年人在线观看视频| 91精品国产99| 日本一区精品视频| 亚洲欧洲一区二区在线观看| 亚洲精一区二区三区| 91视频福利网| 中文字幕欧美激情| 9i看片成人免费看片| 亚洲国产精品电影| 亚洲小说区图片| 国产精品男人的天堂| 亚洲激情77| www精品久久| 国产精品一区二区在线播放| 亚洲激情图片网| 欧洲生活片亚洲生活在线观看| 无码精品人妻一区二区| 欧美另类xxx| 成人国产精品久久| 色香蕉在线观看| 经典一区二区三区| 香蕉成人在线视频| 91黄色免费看| 激情小视频在线| 国产成人一区二区三区小说 | 国产成人午夜视频| 日本少妇高清视频| 欧美精品成人一区二区三区四区| porn视频在线观看| 国产精品成av人在线视午夜片 | 精品国模一区二区三区欧美| 亚洲一区二区精品在线| 青青国产91久久久久久| 调教驯服丰满美艳麻麻在线视频| 日韩欧美亚洲范冰冰与中字| 在线观看xxx| 51精品在线观看| 性欧美lx╳lx╳| 999香蕉视频| 欧美国产欧美综合| 在线免费观看高清视频| 最近2019中文字幕mv免费看| 日本久久二区| 在线精品亚洲一区二区| 国产原创一区二区三区| 国产黄色片在线免费观看| 欧美成人一区二区三区在线观看| 久久国产精品黑丝| 久精品国产欧美| 日韩精品午夜视频| 亚洲激情图片网| 日韩午夜电影av| 白白色在线观看| 欧美h视频在线| 日本欧美在线看| 精品一区在线观看视频| 日韩美女一区二区三区四区| 2021中文字幕在线| 欧洲一区二区日韩在线视频观看免费 | 亚洲一区在线电影| 婷婷开心激情网| 国产精品第一页在线| 性欧美69xoxoxoxo| 美女黄色一级视频| 日韩欧美中文字幕在线播放| 波多野结衣在线网站| 91系列在线播放| 亚洲三级网站| 美国美女黄色片| 日韩视频在线你懂得| 在线播放高清视频www| 水蜜桃一区二区三区| 粉嫩av一区二区三区粉嫩| 黄色片中文字幕| 久久久国产精彩视频美女艺术照福利| 91精品尤物| 在线观看的毛片| 亚洲一区国产视频| 国产一区电影| 国产精品欧美久久| 日本不卡视频一二三区| 免费在线一级片| 一色桃子一区二区| 哺乳挤奶一区二区三区免费看 | 91香蕉在线视频| 在线视频欧美日韩精品| 国产91精品入| 亚洲午夜精品一区| 狠狠色狠狠色综合日日五| 蜜桃视频网站在线| 欧美大香线蕉线伊人久久| 激情五月播播久久久精品| www亚洲视频|