鴻蒙OS 對象關(guān)系映射數(shù)據(jù)庫開發(fā)指導(dǎo)

2020-09-18 16:02 更新

場景介紹

關(guān)系型數(shù)據(jù)庫是在 SQLite 基礎(chǔ)上實(shí)現(xiàn)的本地?cái)?shù)據(jù)操作機(jī)制,提供給用戶無需編寫原生 SQL 語句就能進(jìn)行數(shù)據(jù)增刪改查的方法,同時(shí)也支持原生 SQL 操作。

接口說明

數(shù)據(jù)庫的創(chuàng)建和刪除

關(guān)系型數(shù)據(jù)庫提供了數(shù)據(jù)庫創(chuàng)建方式,以及對應(yīng)的刪除接口,涉及的 API 如下所示。

類名 接口名 描述
StoreConfig.Builder public builder() 對數(shù)據(jù)庫進(jìn)行配置,包括設(shè)置數(shù)據(jù)庫名、存儲(chǔ)模式、日志模式、同步模式,是否為只讀,及對數(shù)據(jù)庫加密。
RdbOpenCallback public abstract void onCreate(RdbStore store) 數(shù)據(jù)庫創(chuàng)建時(shí)被回調(diào),開發(fā)者可以在該方法中初始化表結(jié)構(gòu),并添加一些應(yīng)用使用到的初始化數(shù)據(jù)。
RdbOpenCallback public abstract void onUpgrade(RdbStore store, int currentVersion, int targetVersion) 數(shù)據(jù)庫升級(jí)時(shí)被回調(diào)。
DatabaseHelper public RdbStore getRdbStore(StoreConfig config, int version, RdbOpenCallback openCallback, ResultSetHook resultSetHook) 根據(jù)配置創(chuàng)建或打開數(shù)據(jù)庫。
DatabaseHelper public boolean deleteRdbStore(String name) 刪除指定的數(shù)據(jù)庫。

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

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

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

數(shù)據(jù)庫的增刪改查

關(guān)系型數(shù)據(jù)庫提供本地?cái)?shù)據(jù)增刪改查操作的能力,相關(guān) API 如下所示。

  • 新增

關(guān)系型數(shù)據(jù)庫提供了插入數(shù)據(jù)的接口,通過 ValuesBucket 輸入要存儲(chǔ)的數(shù)據(jù),通過返回值判斷是否插入成功,插入成功時(shí)返回最新插入數(shù)據(jù)所在的行號(hào),失敗則返回 -1。

類名 接口名 描述
RdbStore long insert(String table, ValuesBucket initialValues) 向數(shù)據(jù)庫插入數(shù)據(jù)。table:待添加數(shù)據(jù)的表名。initialValues:以ValuesBucket存儲(chǔ)的待插入的數(shù)據(jù)。它提供一系列put方法,如putString(String columnName, String values),putDouble(String columnName, double value),用于向ValuesBucket中添加數(shù)據(jù)。

  • 更新

調(diào)用更新接口,傳入要更新的數(shù)據(jù),并通過AbsRdbPredicates 指定更新條件。該接口的返回值表示更新操作影響的行數(shù)。如果更新失敗,則返回0。

類名 接口名 描述
RdbStore int update(ValuesBucket values, AbsRdbPredicates predicates) 更新數(shù)據(jù)庫表中符合謂詞指定條件的數(shù)據(jù)。values:以 ValuesBucket 存儲(chǔ)的要更新的數(shù)據(jù)。predicates:指定了更新操作的表名和條件。AbsRdbPredicates 的實(shí)現(xiàn)類有兩個(gè):RdbPredicates 和 RawRdbPredidates。RdbPredicates:支持調(diào)用謂詞提供的 equalTo 等接口,設(shè)置更新條件。RawRdbPredidates:僅支持設(shè)置表名、where 條件子句、whereArgs 三個(gè)參數(shù),不支持equalTo 等接口調(diào)用。

  • 刪除

調(diào)用刪除接口,通過 AbsRdbPredicates 指定刪除條件。該接口的返回值表示刪除的數(shù)據(jù)行數(shù),可根據(jù)此值判斷是否刪除成功。如果刪除失敗,則返回 0。

類名 接口名 描述
RdbStore int delete(AbsRdbPredicates predicates) 刪除數(shù)據(jù)。predicates:Rdb 謂詞,指定了刪除操作的表名和條件。AbsRdbPredicates 的實(shí)現(xiàn)類有兩個(gè):RdbPredicates 和 RawRdbPredidates。RdbPredicates:支持調(diào)用謂詞提供的 equalTo 等接口,設(shè)置更新條件。 RawRdbPredidates:僅支持設(shè)置表名、where 條件子句、whereArgs 三個(gè)參數(shù),不支持 equalTo 等接口調(diào)用。

  • 查詢

關(guān)系型數(shù)據(jù)庫提供了兩種查詢數(shù)據(jù)的方式:

  • 直接調(diào)用查詢接口。使用該接口,會(huì)將包含查詢條件的謂詞自動(dòng)拼接成完整的 SQL 語句進(jìn)行查詢操作,無需用戶傳入原生的 SQL。
  • 執(zhí)行原生的用于查詢的 SQL 語句。
類名 接口名 描述
RdbStore ResultSet query(AbsRdbPredicates predicates, String[] columns) 查詢數(shù)據(jù)。predicates:謂詞,可以設(shè)置查詢條件。AbsRdbPredicates 的實(shí)現(xiàn)類有兩個(gè): RdbPredicates 和 RawRdbPredidates。 RdbPredicates:支持調(diào)用謂詞提供的 equalTo 等接口,設(shè)置查詢條件。RawRdbPredidates:僅支持設(shè)置表名、where 條件子句、whereArgs 三個(gè)參數(shù),不支持 equalTo 等接口調(diào)用。columns:規(guī)定查詢返回的列。
RdbStore ResultSet querySql(String sql, String[] sqlArgs) 執(zhí)行原生的用于查詢操作的 SQL 語句。sql:原生用于查詢的 sql 語句。sqlArgs:sql 語句中占位符參數(shù)的值,若 select 語句中沒有使用占位符,該參數(shù)可以設(shè)置為 null。

數(shù)據(jù)庫謂詞的使用

關(guān)系型數(shù)據(jù)庫提供了用于設(shè)置數(shù)據(jù)庫操作條件的謂詞 AbsRdbPredicates,其中包括兩個(gè)實(shí)現(xiàn)子類 RdbPredicates 和 RawRdbPredicates:

  • RdbPredicates:開發(fā)者無需編寫復(fù)雜的 SQL 語句,僅通過調(diào)用該類中條件相關(guān)的方法,如 equalTo、notEqualTo、groupBy、orderByAsc、beginsWith 等,就可自動(dòng)完成 SQL 語句拼接,方便用戶聚焦業(yè)務(wù)操作。
  • RawRdbPredicates:可滿足復(fù)雜 SQL 語句的場景,支持開發(fā)者自己設(shè)置 where 條件子句和 whereArgs 參數(shù)。不支持 equalTo 等條件接口的使用。
類名 接口名 描述
RdbPredicates RdbPredicates equalTo(String field, String value) 設(shè)置謂詞條件,滿足filed字段與value值相等。
RdbPredicates RdbPredicates notEqualTo(String field, String value) 設(shè)置謂詞條件,滿足filed字段與value值不相等。
RdbPredicates RdbPredicates beginsWith(String field, String value) 設(shè)置謂詞條件,滿足field字段以value值開頭。
RdbPredicates RdbPredicates between(String field, int low, int high) 設(shè)置謂詞條件,滿足field字段在最小值low和最大值high之間。
RdbPredicates RdbPredicates orderByAsc(String field) 設(shè)置謂詞條件,根據(jù)field字段升序排列。
RawRdbPredicates void setWhereClause(String whereClause) 設(shè)置where條件子句。
RawRdbPredicates void setWhereArgs(List<String> whereArgs) 設(shè)置whereArgs參數(shù),該值表示where子句中占位符的值。

查詢結(jié)果集的使用

關(guān)系型數(shù)據(jù)庫提供了查詢返回的結(jié)果集 ResultSet,他指向查詢結(jié)果中的一行數(shù)據(jù),供用戶對查詢結(jié)果進(jìn)行遍歷和訪問。ReusltSet 的對外 API 如下表格。

類名 接口名 描述
ResultSet boolean goTo(int offset) 從結(jié)果集當(dāng)前位置移動(dòng)指定偏移量。
ResultSet boolean goToRow(int position) 將結(jié)果集移動(dòng)到指定位置。
ResultSet boolean goToNextRow() 將結(jié)果集向后移動(dòng)一行。
ResultSet boolean goToPreviousRow() 將結(jié)果集向前移動(dòng)一行。
ResultSet boolean isStarted() 判斷結(jié)果集是否被移動(dòng)過。
ResultSet boolean isEnded() 判斷結(jié)果集當(dāng)前位置是否在最后一行之后。
ResultSet boolean isAtFirstRow() 判斷結(jié)果集當(dāng)前位置是否在第一行。
ResultSet boolean isAtLastRow() 判斷結(jié)果集當(dāng)前位置是否在最后一行。
ResultSet int getRowCount() 獲取當(dāng)前結(jié)果集中的記錄條數(shù)。
ResultSet int getColumnCount() 獲取結(jié)果集中的列數(shù)。
ResultSet String getString(int columnIndex) 獲取當(dāng)前行指定索列的值,以String類型返回。
ResultSet byte[] getBlob(int columnIndex) 獲取當(dāng)前行指定列的值,以字節(jié)數(shù)組形式返回。
ResultSet double getDouble(int columnIndex) 獲取當(dāng)前行指定列的值,以double型返回。

事務(wù)

關(guān)系型數(shù)據(jù)庫提供事務(wù)機(jī)制,來保證用戶操作的原子性。對單條數(shù)據(jù)進(jìn)行數(shù)據(jù)庫操作時(shí),無需開啟事務(wù);插入大量數(shù)據(jù)時(shí),開啟事務(wù)可以保證數(shù)據(jù)的準(zhǔn)確性。如果中途操作出現(xiàn)失敗,會(huì)執(zhí)行回滾操作。

類名 接口名 描述
RdbStore beginTransaction() 開啟事務(wù)。
RdbStore markAsCommit() 設(shè)置事務(wù)的標(biāo)記為成功。
RdbStore endTransaction() 結(jié)束事務(wù)。

事務(wù)和結(jié)果集觀察者

關(guān)系型數(shù)據(jù)庫提供了事務(wù)和結(jié)果集觀察者能力,當(dāng)對應(yīng)的事件被觸發(fā)時(shí),觀察者會(huì)收到通知。

類名 接口名 描述
RdbStore beginTransactionWithObserver(TransactionObserver transactionObserver) 開啟事務(wù),并觀察事務(wù)的啟動(dòng)、提交和回滾。
ResultSet void registerObserver(DataObserver observer) 注冊結(jié)果集的觀察者。
ResultSet void unregisterObserver(DataObserver observer) 注銷結(jié)果集的觀察者。

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

用戶可以將當(dāng)前數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行保存進(jìn)行備份,還可以在需要的時(shí)候進(jìn)行數(shù)據(jù)恢復(fù)。

類名 接口名稱 描述
RdbStore boolean restore(String srcName) 數(shù)據(jù)庫恢復(fù)接口,從指定的非加密數(shù)據(jù)庫文件中恢復(fù)數(shù)據(jù)。
RdbStore boolean restore(String srcName, byte[] srcEncryptKey, byte[] destEncryptKey) 數(shù)據(jù)庫恢復(fù)接口,從指定的數(shù)據(jù)庫文件(加密和非加密均可)中恢復(fù)數(shù)據(jù)。
RdbStore boolean backup(String destName) 數(shù)據(jù)庫備份接口,備份出的數(shù)據(jù)庫文件是非加密的。
RdbStore boolean backup(String destName, byte[] destEncryptKey) 數(shù)據(jù)庫備份接口,此方法經(jīng)常用在備份出加密數(shù)據(jù)庫場景。

開發(fā)步驟

  1. 創(chuàng)建數(shù)據(jù)庫。

  1. 配置數(shù)據(jù)庫相關(guān)信息,包括數(shù)據(jù)庫的名稱、存儲(chǔ)模式、是否為只讀模式等。
  2. 初始化數(shù)據(jù)庫表結(jié)構(gòu)和相關(guān)數(shù)據(jù)。
  3. 創(chuàng)建數(shù)據(jù)庫。

示例代碼如下:

   StoreConfig config = StoreConfig.newDefaultConfig("RdbStoreTest.db");
   private static final RdbOpenCallback callback = new RdbOpenCallback() {
       @Override
       public void onCreate(RdbStore store) {
           store.executeSql("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, salary REAL, blobType BLOB)");
       }
       @Override
       public void onUpgrade(RdbStore store, int oldVersion, int newVersion) {
       }
   };
   DatabaseHelper helper = new DatabaseHelper(context);
   RdbStore store = helper.getRdbStore(config, 1, callback, null);

  1. 插入數(shù)據(jù)。

  1. 構(gòu)造要插入的數(shù)據(jù),以 ValuesBucket 形式存儲(chǔ)。
  2. 調(diào)用關(guān)系型數(shù)據(jù)庫提供的插入接口。

示例代碼如下:

   ValuesBucket values = new ValuesBucket();
   values.putInteger("id", 1);
   values.putString("name", "zhangsan");
   values.putInteger("age", 18);
   values.putDouble("salary", 100.5);
   values.putByteArray("blobType", new byte[] {1, 2, 3});
   long id = store.insert("test", values);

  1. 查詢數(shù)據(jù)。

  1. 構(gòu)造用于查詢的謂詞對象,設(shè)置查詢條件。
  2. 指定查詢返回的數(shù)據(jù)列。
  3. 調(diào)用查詢接口查詢數(shù)據(jù)。
  4. 調(diào)用結(jié)果集接口,遍歷返回結(jié)果。

示例代碼如下:

   String[] columns = new String[] {"id", "name", "age", "salary"};
   RdbPredicates rdbPredicates = new RdbPredicates("test").equalTo("age", 25).orderByAsc("salary"); 
   ResultSet resultSet = store.query(rdbPredicates, columns);
   resultSet.goToNextRow();
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)