成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[413806]]

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

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

https://harmonyos.51cto.com

簡(jiǎn)單使用

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

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

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

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

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

  1. //1. 構(gòu)建需要插入的數(shù)據(jù),關(guān)系型數(shù)據(jù)庫(kù)中,插入的數(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. 查詢(xún)數(shù)據(jù)

查詢(xún)操作

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

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

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

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

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

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

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

參數(shù)說(shuō)明:

  • String sql:原生用于查詢(xún)的sql語(yǔ)句
  • String[] sqlArgs:sql語(yǔ)句中占位符參數(shù)的值,若select語(yǔ)句中沒(méi)有使用占位符,該參數(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)用查詢(xún)方法獲取到ResultSet時(shí),其默認(rèn)并沒(méi)有指向當(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ù),并通過(guò)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)用刪除接口,通過(guò)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ù)庫(kù)提供事務(wù)機(jī)制,來(lái)保證用戶(hù)操作的原子性。對(duì)單條數(shù)據(jù)進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),無(wú)需開(kāi)啟事務(wù);插入大量數(shù)據(jù)時(shí),開(kāi)啟事務(wù)可以保證數(shù)據(jù)的準(zhǔn)確性。如果中途操作出現(xiàn)失敗,會(huì)執(zhí)行回滾操作。

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

beginTransaction():開(kāi)啟事務(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. //開(kāi)啟事務(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(); 

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

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

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

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

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

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

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

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

https://harmonyos.51cto.com

 

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

2021-09-06 10:24:12

鴻蒙HarmonyOS應(yīng)用

2018-07-18 09:16:39

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

2017-03-17 14:44:04

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

2010-12-10 10:17:21

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

2022-06-13 08:30:01

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

2009-08-24 16:46:04

C# 泛型

2020-12-29 11:26:22

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

2013-04-26 16:18:29

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

2021-01-26 13:31:48

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

2023-05-20 08:11:55

2023-05-22 16:10:51

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

2022-12-27 08:38:45

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

2016-08-23 14:25:19

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

2022-07-27 08:32:01

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

2018-03-26 12:58:52

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

2013-06-28 11:28:21

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

2015-04-24 13:59:41

2009-03-26 09:58:55

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

2018-06-07 08:31:33

Oracle分布式內(nèi)存

2011-04-13 16:13:53

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

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

主站蜘蛛池模板: 欧美一卡二卡在线观看 | 国产精品五月天 | 国产成人在线播放 | 人人看人人草 | 亚洲精品久久国产高清情趣图文 | 亚洲免费三区 | 国产午夜精品久久久久 | 午夜精品一区二区三区在线视频 | 国产中文| 91视频观看 | 精久久久 | 亚洲一区二区在线视频 | 国产精品激情小视频 | 不用播放器看的av | 免费在线观看一区二区三区 | 极情综合网 | 欧美精品在线播放 | 欧日韩在线 | 激情在线视频网站 | 91视视频在线观看入口直接观看 | 亚洲一区在线日韩在线深爱 | 久久久久久久久久久91 | 国产在线视频一区二区 | 国产精品久久久久久婷婷天堂 | 精品久久一区 | 日韩欧美国产综合 | 一级免费黄色 | 免费观看av网站 | 日韩网站在线观看 | 成人免费一区二区 | 精品亚洲一区二区三区 | 亚洲二区在线观看 | 成人三级视频 | 国产精品乱码一区二三区小蝌蚪 | 亚洲精品国产一区 | 福利国产| 国产色网站 | 黄免费观看视频 | 亚洲 一区 | 国产精品视频一区二区三区不卡 | 精品无码久久久久久久动漫 |