日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

HarmonyOS之数据管理·关系型数据库的应用

發(fā)布時(shí)間:2024/5/21 数据库 129 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HarmonyOS之数据管理·关系型数据库的应用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、簡介

① 基本概念
  • 關(guān)系型數(shù)據(jù)庫(Relational Database,RDB)是一種基于關(guān)系模型來管理數(shù)據(jù)的數(shù)據(jù)庫。HarmonyOS 關(guān)系型數(shù)據(jù)庫基于 SQLite 組件提供了一套完整的對(duì)本地?cái)?shù)據(jù)庫進(jìn)行管理的機(jī)制,對(duì)外提供了一系列的增、刪、改、查接口,也可以直接運(yùn)行用戶輸入的 SQL 語句來滿足復(fù)雜的場景需要。HarmonyOS 提供的關(guān)系型數(shù)據(jù)庫功能更加完善,查詢效率更高。
  • 關(guān)系型數(shù)據(jù)庫:創(chuàng)建在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫,以行和列的形式存儲(chǔ)數(shù)據(jù)。
  • 謂詞:數(shù)據(jù)庫中用來代表數(shù)據(jù)實(shí)體的性質(zhì)、特征或者數(shù)據(jù)實(shí)體之間關(guān)系的詞項(xiàng),主要用來定義數(shù)據(jù)庫的操作條件。
  • 結(jié)果集:指用戶查詢之后的結(jié)果集合,可以對(duì)數(shù)據(jù)進(jìn)行訪問。結(jié)果集提供了靈活的數(shù)據(jù)訪問方式,可以更方便的拿到用戶想要的數(shù)據(jù)。
  • SQLite 數(shù)據(jù)庫:一款輕型的數(shù)據(jù)庫,是遵守 ACID 的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它是一個(gè)開源的項(xiàng)目。
② 運(yùn)作機(jī)制
  • HarmonyOS 關(guān)系型數(shù)據(jù)庫對(duì)外提供通用的操作接口,底層使用 SQLite 作為持久化存儲(chǔ)引擎,支持 SQLite 具有的所有數(shù)據(jù)庫特性,包括但不限于事務(wù)、索引、視圖、觸發(fā)器、外鍵、參數(shù)化查詢和預(yù)編譯 SQL 語句。
  • 關(guān)系型數(shù)據(jù)庫運(yùn)作機(jī)制如下圖所示:

③ 配置
  • 如果不指定數(shù)據(jù)庫的日志模式,那么系統(tǒng)默認(rèn)日志方式是 WAL(Write Ahead Log)模式。
  • 如果不指定數(shù)據(jù)庫的落盤模式,那么系統(tǒng)默認(rèn)落盤方式是 FULL 模式。
  • HarmonyOS 數(shù)據(jù)庫使用的共享內(nèi)存默認(rèn)大小是 2MB。
  • 數(shù)據(jù)庫中連接池的最大數(shù)量是 4 個(gè),用以管理用戶的讀寫操作。
  • 為保證數(shù)據(jù)的準(zhǔn)確性,數(shù)據(jù)庫同一時(shí)間只能支持一個(gè)寫操作。
④ 應(yīng)用場景
  • 關(guān)系型數(shù)據(jù)庫是在 SQLite 基礎(chǔ)上實(shí)現(xiàn)的本地?cái)?shù)據(jù)操作機(jī)制,提供給用戶無需編寫原生 SQL 語句就能進(jìn)行數(shù)據(jù)增刪改查的方法,同時(shí)也支持原生 SQL 操作。

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

① 數(shù)據(jù)庫的創(chuàng)建和刪除
  • 關(guān)系型數(shù)據(jù)庫提供了數(shù)據(jù)庫創(chuàng)建方式,以及對(duì)應(yīng)的刪除接口,涉及的 API 如下所示:
類名接口名描述
StoreConfig.Builderpublic builder()對(duì)數(shù)據(jù)庫進(jìn)行配置,包括設(shè)置數(shù)據(jù)庫名、存儲(chǔ)模式、日志模式、同步模式,是否為只讀,及對(duì)數(shù)據(jù)庫加密
RdbOpenCallbackpublic abstract void onCreate(RdbStore store)數(shù)據(jù)庫創(chuàng)建時(shí)被回調(diào),開發(fā)者可以在該方法中初始化表結(jié)構(gòu),并添加一些應(yīng)用使用到的初始化數(shù)據(jù)
RdbOpenCallbackpublic abstract void onUpgrade(RdbStore store, int currentVersion, int targetVersion)數(shù)據(jù)庫升級(jí)時(shí)被回調(diào)
DatabaseHelperpublic RdbStore getRdbStore(StoreConfig config, int version, RdbOpenCallback openCallback, ResultSetHook resultSetHook)根據(jù)配置創(chuàng)建或打開數(shù)據(jù)庫
DatabaseHelperpublic 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í),需要傳入正確密鑰。
  • 數(shù)據(jù)庫傳入密鑰接口如下:
類名接口名描述
StoreConfig.BuilderBuilder 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)系型數(shù)據(jù)庫提供了插入數(shù)據(jù)的接口,通過 ValuesBucket 輸入要存儲(chǔ)的數(shù)據(jù),通過返回值判斷是否插入成功,插入成功時(shí)返回最新插入數(shù)據(jù)所在的行號(hào),失敗則返回-1。數(shù)據(jù)庫插入 API 如下所示:
類名接口名描述
RdbStorelong 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。數(shù)據(jù)庫更新 API 如下:
類名接口名描述
RdbStoreint update(ValuesBucket values, AbsRdbPredicates predicates)更新數(shù)據(jù)庫表中符合謂詞指定條件的數(shù)據(jù)。
values:以ValuesBucket存儲(chǔ)的要更新的數(shù)據(jù)。
predicates:指定了更新操作的表名和條件。AbsRdbPredicates的實(shí)現(xiàn)類有兩個(gè):RdbPredicates和RawRdbPredicates。RdbPredicates:支持調(diào)用謂詞提供的equalTo等接口,設(shè)置更新條件。RawRdbPredicates:僅支持設(shè)置表名、where條件子句、whereArgs三個(gè)參數(shù),不支持equalTo等接口調(diào)用
  • 刪除:調(diào)用刪除接口,通過 AbsRdbPredicates 指定刪除條件,該接口的返回值表示刪除的數(shù)據(jù)行數(shù),可根據(jù)此值判斷是否刪除成功。如果刪除失敗,則返回 0。數(shù)據(jù)庫刪除 API 如下:
類名接口名描述
RdbStoreint delete(AbsRdbPredicates predicates)刪除數(shù)據(jù)。
predicates:Rdb謂詞,指定了刪除操作的表名和條件。
AbsRdbPredicates的實(shí)現(xiàn)類有兩個(gè):RdbPredicates和RawRdbPredicates。RdbPredicates:支持調(diào)用謂詞提供的equalTo等接口,設(shè)置更新條件。RawRdbPredicates:僅支持設(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 語句。
  • 數(shù)據(jù)庫查詢 API 如下:
類名接口名描述
RdbStoreResultSet query(AbsRdbPredicates predicates, String[] columns)查詢數(shù)據(jù)。
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ī)定查詢返回的列。
RdbStoreResultSet 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 等條件接口的使用。
  • 數(shù)據(jù)庫謂詞 API 如下:
類名接口名描述
RdbPredicatesRdbPredicates equalTo(String field, String value)設(shè)置謂詞條件,滿足field字段與value值相等
RdbPredicatesRdbPredicates notEqualTo(String field, String value)設(shè)置謂詞條件,滿足field字段與value值不相等
RdbPredicatesRdbPredicates beginsWith(String field, String value)設(shè)置謂詞條件,滿足field字段以value值開頭
RdbPredicatesRdbPredicates between(String field, int low, int high)設(shè)置謂詞條件,滿足field字段在最小值low和最大值high之間
RdbPredicatesRdbPredicates orderByAsc(String field)設(shè)置謂詞條件,根據(jù)field字段升序排列
RawRdbPredicatesvoid setWhereClause(String whereClause)設(shè)置where條件子句
RawRdbPredicatesvoid setWhereArgs(List whereArgs)設(shè)置whereArgs參數(shù),該值表示where子句中占位符的值
⑤ 查詢結(jié)果集的使用
  • 關(guān)系型數(shù)據(jù)庫提供了查詢返回的結(jié)果集 ResultSet,指向查詢結(jié)果中的一行數(shù)據(jù),供用戶對(duì)查詢結(jié)果進(jìn)行遍歷和訪問。ResultSet 的對(duì)外 API 如下表格:
類名接口名描述
ResultSetboolean goTo(int offset)從結(jié)果集當(dāng)前位置移動(dòng)指定偏移量
ResultSetboolean goToRow(int position)將結(jié)果集移動(dòng)到指定位置
ResultSetboolean goToNextRow()將結(jié)果集向后移動(dòng)一行
ResultSetboolean goToPreviousRow()將結(jié)果集向前移動(dòng)一行
ResultSetboolean isStarted()判斷結(jié)果集是否被移動(dòng)過
ResultSetboolean isEnded()判斷結(jié)果集當(dāng)前位置是否在最后一行之后
ResultSetboolean isAtFirstRow()判斷結(jié)果集當(dāng)前位置是否在第一行
ResultSetboolean isAtLastRow()判斷結(jié)果集當(dāng)前位置是否在最后一行
ResultSetint getRowCount()獲取當(dāng)前結(jié)果集中的記錄條數(shù)
ResultSetint getColumnCount()獲取結(jié)果集中的列數(shù)
ResultSetString getString(int columnIndex)獲取當(dāng)前行指定索列的值,以String類型返回
ResultSetbyte[] getBlob(int columnIndex)獲取當(dāng)前行指定列的值,以字節(jié)數(shù)組形式返回
ResultSetdouble getDouble(int columnIndex)獲取當(dāng)前行指定列的值,以double型返回
⑥ 事務(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 如下:
類名接口名描述
RdbStorebeginTransaction()開啟事務(wù)
RdbStoremarkAsCommit()設(shè)置事務(wù)的標(biāo)記為成功
RdbStoreendTransaction()結(jié)束事務(wù)
⑦ 事務(wù)和結(jié)果集觀察者
  • 關(guān)系型數(shù)據(jù)庫提供了事務(wù)和結(jié)果集觀察者能力,當(dāng)對(duì)應(yīng)的事件被觸發(fā)時(shí),觀察者會(huì)收到通知。
  • API 如下所示:
類名接口名描述
RdbStorebeginTransactionWithObserver(TransactionObserver transactionObserver)開啟事務(wù),并觀察事務(wù)的啟動(dòng)、提交和回滾
ResultSetvoid registerObserver(DataObserver observer)注冊(cè)結(jié)果集的觀察者
ResultSetvoid unregisterObserver(DataObserver observer)注銷結(jié)果集的觀察者
⑧ 數(shù)據(jù)庫的備份和恢復(fù)
  • 用戶可以將當(dāng)前數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行保存進(jìn)行備份,還可以在需要的時(shí)候進(jìn)行數(shù)據(jù)恢復(fù)。
  • 數(shù)據(jù)庫備份和恢復(fù) API 如下:
類名接口名描述
RdbStoreboolean restore(String srcName)數(shù)據(jù)庫恢復(fù)接口,從指定的非加密數(shù)據(jù)庫文件中恢復(fù)數(shù)據(jù)
RdbStoreboolean restore(String srcName, byte[] srcEncryptKey, byte[] destEncryptKey)數(shù)據(jù)庫恢復(fù)接口,從指定的數(shù)據(jù)庫文件(加密和非加密均可)中恢復(fù)數(shù)據(jù)
RdbStoreboolean backup(String destName)數(shù)據(jù)庫備份接口,備份出的數(shù)據(jù)庫文件是非加密的
RdbStoreboolean backup(String destName, byte[] destEncryptKey)數(shù)據(jù)庫備份接口,此方法經(jīng)常用在備份出加密數(shù)據(jù)庫場景

三、關(guān)系型數(shù)據(jù)庫的使用

① 創(chuàng)建數(shù)據(jù)庫
  • 配置數(shù)據(jù)庫相關(guān)信息,包括數(shù)據(jù)庫的名稱、存儲(chǔ)模式、是否為只讀模式等。
  • 初始化數(shù)據(jù)庫表結(jié)構(gòu)和相關(guān)數(shù)據(jù)。
  • 創(chuàng)建數(shù)據(jù)庫。
StoreConfig config = StoreConfig.newDefaultConfig("RdbStoreTest.db");private static RdbOpenCallback callback = new RdbOpenCallback() {@Overridepublic 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)");}@Overridepublic void onUpgrade(RdbStore store, int oldVersion, int newVersion) {}};DatabaseHelper helper = new DatabaseHelper(context);RdbStore store = helper.getRdbStore(config, 1, callback, null);
② 插入數(shù)據(jù)
  • 構(gòu)造要插入的數(shù)據(jù),以 ValuesBucket 形式存儲(chǔ)。
  • 調(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);
③ 查詢數(shù)據(jù)
  • 構(gòu)造用于查詢的謂詞對(duì)象,設(shè)置查詢條件。
  • 指定查詢返回的數(shù)據(jù)列。
  • 調(diào)用查詢接口查詢數(shù)據(jù)。
  • 調(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();

四、完整示例

  • HarmonyOS之基于Data Ability的關(guān)系型數(shù)據(jù)庫操作方法。

總結(jié)

以上是生活随笔為你收集整理的HarmonyOS之数据管理·关系型数据库的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。