偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

鴻蒙關(guān)系型數(shù)據(jù)庫操作實(shí)踐嘗試

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

[[413806]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

簡單使用

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

初始化數(shù)據(jù)庫

  1. public class HiDbHelper { 
  2.  
  3.     //1. 配置數(shù)據(jù)庫相關(guān)信息 
  4.     private static StoreConfig config = StoreConfig.newDefaultConfig("RdbStoreTest.db"); 
  5.  
  6.     //RdbOpenCallback用于管理數(shù)據(jù)庫的創(chuàng)建、升級(jí)和降級(jí) 
  7.     private static RdbOpenCallback callback = new RdbOpenCallback() { 
  8.         @Override 
  9.         public void onCreate(RdbStore rdbStore) { 
  10.             //該方法當(dāng)數(shù)據(jù)庫不存在時(shí)會(huì)被調(diào)用 
  11.             //2. 初始化數(shù)據(jù)庫表 
  12.             rdbStore.executeSql("CREATE TABLE IF NOT EXISTS employee (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, salary REAL, blobType BLOB)"); 
  13.         } 
  14.  
  15.         @Override 
  16.         public void onUpgrade(RdbStore rdbStore, int i, int i1) { 
  17.  
  18.         } 
  19.     }; 
  20.  
  21.     //RdbStore是一個(gè)接口,提供了對(duì)數(shù)據(jù)庫進(jìn)行增刪改查等操作 
  22.     private static volatile RdbStore store; 
  23.  
  24.     //3. 獲取對(duì)數(shù)據(jù)庫操作的對(duì)象 
  25.     public static RdbStore singleStore() { 
  26.         synchronized (HiDbHelper.class) { 
  27.             if (store == null) { 
  28.                 synchronized (HiDbHelper.class) { 
  29.                     //DatabaseHelper提供了多種模式來操作數(shù)據(jù)庫,主要是對(duì)ORM(Object Relational Mapping),RDB(Relational Database),Preferences這三類數(shù)據(jù)庫的構(gòu)建和刪除 
  30.                     DatabaseHelper helper = new DatabaseHelper(MyApplication.appContext); 
  31.                     //通過getRdbStore獲取關(guān)系型數(shù)據(jù)庫對(duì)象 
  32.                     //getRdbStore四個(gè)參數(shù)分別是: 
  33.                     //StoreConfig config: 對(duì)數(shù)據(jù)庫的配置,包括數(shù)據(jù)庫路徑,存儲(chǔ)模式,是否為只讀等 
  34.                     //int version: 數(shù)據(jù)庫版本,主要用于指示數(shù)據(jù)庫的升級(jí)或降級(jí) 
  35.                     //RdbOpenCallback openCallback: 用于管理數(shù)據(jù)庫的創(chuàng)建、升級(jí)和降級(jí) 
  36.                     //ResultSetHook resultSetHook: 這個(gè)類允許用戶自定義結(jié)果集 
  37.                     store = helper.getRdbStore(config, 1, callback, null); 
  38.                 } 
  39.             } 
  40.         } 
  41.         return store; 
  42.     } 

2. 插入數(shù)據(jù)

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

  1. //1. 構(gòu)建需要插入的數(shù)據(jù),關(guān)系型數(shù)據(jù)庫中,插入的數(shù)據(jù)是以ValuesBucket形式存儲(chǔ)的 
  2. ValuesBucket values = new ValuesBucket(); 
  3. values.putInteger("id", 1); 
  4. values.putString("name""zhangsan"); 
  5. values.putInteger("age", 18); 
  6. values.putDouble("salary", 100.5); 
  7. values.putByteArray("blobType", new byte[] {1, 2, 3}); 
  8. //2. 執(zhí)行插入操作,第一個(gè)參數(shù)為數(shù)據(jù)需要插入的表名,第二個(gè)參數(shù)為需要插入的數(shù)據(jù) 
  9. long id = HiDbHelper.singleStore().insert("employee"values); 

3. 查詢數(shù)據(jù)

查詢操作

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

1.通過調(diào)用ResultSet query(AbsRdbPredicates predicates, String[] columns)查詢,該方法將包含查詢條件的謂詞自動(dòng)拼接成完整的SQL語句進(jìn)行查詢操作,無需調(diào)用者傳入原生的SQL

傳入?yún)?shù)說明

  • AbsRdbPredicates predicates:謂詞,可設(shè)置查詢條件。AbsRdbPredicates的實(shí)現(xiàn)類有兩個(gè):RdbPredicates和RawRdbPredicates
  • RdbPredicates:支持調(diào)用謂詞提供的equalTo等接口,設(shè)置查詢條件。
  • RawRdbPredicates:僅支持設(shè)置表名、where條件子句、whereArgs三個(gè)參數(shù),不支持equalTo等接口調(diào)用。
  • columns:規(guī)定查詢返回的列。

關(guān)于更多謂詞的使用可以查詢官方文檔關(guān)系型數(shù)據(jù)庫開發(fā)指導(dǎo)

  1. //1. 需要查詢的列 
  2. String[] columns = new String[] {"id""name""age""salary"}; 
  3. //2. 構(gòu)建查詢條件 
  4. RdbPredicates rdbPredicates = new RdbPredicates("employee").equalTo("age", 23).orderByAsc("salary"); 
  5. //3. 查詢獲取結(jié)果集 
  6. ResultSet resultSet = HiDbHelper.singleStore().query(rdbPredicates, columns); 

通過調(diào)用ResultSet querySql(String sql, String[] sqlArgs)使用原生SQL語句進(jìn)行查詢

參數(shù)說明:

  • String sql:原生用于查詢的sql語句
  • String[] sqlArgs:sql語句中占位符參數(shù)的值,若select語句中沒有使用占位符,該參數(shù)可以設(shè)置為null。
  1. String sql = "select id,name,age,salary from employee where age = 23"
  2. ResultSet resultSet = HiDbHelper.singleStore().querySql(sql, null); 

結(jié)果集處理

當(dāng)調(diào)用查詢方法獲取到ResultSet時(shí),其默認(rèn)并沒有指向當(dāng)前結(jié)果集中的數(shù)據(jù),如果此時(shí)調(diào)用其String getString(int columnIndex)獲取當(dāng)前行指定索列的值,則會(huì)拋出異常

  1. ohos.data.resultset.ResultSetIndexOutOfRangeException: checkState :row index is illegal. 

正確的操作應(yīng)該是:

先調(diào)用boolean goToNextRow()將結(jié)果集向后移動(dòng)一行,返回true這表示當(dāng)前位置有數(shù)據(jù),再對(duì)結(jié)果進(jìn)行處理,如果要獲取ResultSet更多使用方式,可以查看官方文檔

  1. if (resultSet.goToNextRow()) { 
  2.     HiLog.debug(TAG, "select name is %{public}s", resultSet.getString(1)); 

4. 更新數(shù)據(jù)

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

  1. //1. 構(gòu)建需要更新的數(shù)據(jù)的條件 
  2. RdbPredicates rdbPredicates = new RdbPredicates("employee"
  3.                         .equalTo("id",1); 
  4. //2. 構(gòu)建需要更新的數(shù)據(jù) 
  5. ValuesBucket values = new ValuesBucket(); 
  6. values.putString("name","Mo"); 
  7. //3. 執(zhí)行更新操作 
  8. HiDbHelper.singleStore().update(values, rdbPredicates); 

5. 刪除數(shù)據(jù)

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

  1. //1. 構(gòu)建需要?jiǎng)h除數(shù)據(jù)的條件 
  2. RdbPredicates rdbPredicates = new RdbPredicates("test"
  3.                         .equalTo("id", 1); 
  4. //2. 執(zhí)行刪除操作 
  5. HiDbHelper.singleStore().delete(rdbPredicates); 

事務(wù)

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

事務(wù)的API一共有三個(gè)

beginTransaction():開啟事務(wù)。

markAsCommit():設(shè)置事務(wù)的標(biāo)記為成功。

endTransaction():結(jié)束事務(wù)。

其中markAsCommit()和endTransaction()必須與beginTransaction(),如果單獨(dú)調(diào)用,則會(huì)拋出異常

markAsCommit()與endTransaction()不能獨(dú)立調(diào)用

如果單獨(dú)調(diào)用markAsCommit()

則會(huì)拋出異常

  1. java.util.EmptyStackException 

如果單獨(dú)調(diào)用endTransaction()

則會(huì)拋出異常

  1. java.lang.IllegalStateException: Cannot do the transaction operation, because there is no current transaction

如果在事務(wù)塊中如果調(diào)用了markAsCommit(),本次批量操作數(shù)據(jù)出現(xiàn)錯(cuò)誤,則不會(huì)進(jìn)行回滾操作,該方法可以用于某些情況下阻止回滾

示例代碼

  1. ValuesBucket values = new ValuesBucket(); 
  2. values.putInteger("id", 1); 
  3. values.putString("name""zhangsan"); 
  4. values.putInteger("age", 18); 
  5. values.putDouble("salary", 100.5); 
  6. values.putByteArray("blobType", new byte[] {1, 2, 3}); 
  7.  
  8. //開啟事務(wù) 
  9. HiDbHelper.singleStore().beginTransaction(); 
  10. //插入兩條id相同的數(shù)據(jù) 
  11. long id1 = HiDbHelper.singleStore().insert("employee"values); 
  12. long id2 = HiDbHelper.singleStore().insert("employee"values); 
  13. //加入下列的判斷,即使id2插入不成功,本次事務(wù)也不會(huì)進(jìn)行回滾 
  14. //if(id1 == 1) { 
  15. //  HiDbHelper.singleStore().markAsCommit(); 
  16. //} 
  17. //結(jié)束事務(wù) 
  18. HiDbHelper.singleStore().endTransaction(); 

開啟事務(wù)除使用beginTransaction()外,還可以使用beginTransactionWithObserver(TransactionObserver transactionObserver),在開啟事務(wù)的同時(shí)注冊(cè)觀察者,用于監(jiān)聽事務(wù)的開啟,提交,回滾操作。

注意:在開啟事務(wù)后,一定記得在適當(dāng)?shù)臅r(shí)機(jī)進(jìn)行關(guān)閉操作,否則在對(duì)數(shù)據(jù)庫進(jìn)行備份等操作時(shí)會(huì)拋出異常

  1. java.lang.IllegalArgumentException: The rdb is in transaction

為了代碼的健壯性,可以在對(duì)數(shù)據(jù)庫進(jìn)行備份等操作前調(diào)用RdbStore的isInTransaction判斷當(dāng)前是否有事務(wù)還沒有關(guān)閉,如果沒有關(guān)閉,則進(jìn)行關(guān)閉操作

數(shù)據(jù)庫升級(jí),降級(jí),備份,刪除,恢復(fù)

作為一名老移動(dòng)端開發(fā)者,由于最近事務(wù)繁忙,這部分功能暫時(shí)沒有有效的驗(yàn)證,有玩過的朋友歡迎進(jìn)行進(jìn)一步的分享。也可以期待后續(xù)我的帖子。

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-09-06 10:24:12

鴻蒙HarmonyOS應(yīng)用

2018-07-18 09:16:39

關(guān)系型非關(guān)系型數(shù)據(jù)庫

2017-03-17 14:44:04

關(guān)系型數(shù)據(jù)庫原理

2010-12-10 10:17:21

關(guān)系型數(shù)據(jù)庫

2022-06-13 08:30:01

數(shù)據(jù)庫管理系統(tǒng)

2009-08-24 16:46:04

C# 泛型

2020-12-29 11:26:22

鴻蒙HarmonyOS數(shù)據(jù)庫

2013-04-26 16:18:29

大數(shù)據(jù)全球技術(shù)峰會(huì)

2021-01-26 13:31:48

數(shù)據(jù)庫關(guān)系型數(shù)據(jù)庫冗余

2023-05-22 16:10:51

動(dòng)態(tài)共享包數(shù)據(jù)庫

2023-05-20 08:11:55

2022-07-27 08:32:01

數(shù)據(jù)庫MySQL

2016-08-23 14:25:19

MySQL約束數(shù)據(jù)庫

2022-12-27 08:38:45

關(guān)系型數(shù)據(jù)庫設(shè)計(jì)

2018-03-26 12:58:52

數(shù)據(jù)庫OracleMySQL

2013-06-28 11:28:21

Facebook數(shù)據(jù)庫大數(shù)據(jù)

2015-04-24 13:59:41

2009-03-26 09:58:55

云計(jì)算關(guān)系型數(shù)據(jù)庫關(guān)系數(shù)據(jù)庫

2018-06-07 08:31:33

Oracle分布式內(nèi)存

2011-04-13 16:13:53

云計(jì)算關(guān)系型數(shù)據(jù)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)