OpenHarmony關系型數據庫封裝前的知識要點
1、概述
關系型數據庫(Relational Database, 以下簡稱RDB)是一種基于關系模型來管理數據的數據庫,是在SQLite基礎上提供一套完整的對本地數據庫進行管理的機制,為開發者提供無需編寫原生SQL語句即可實現數據增、刪、改、查等接口,同時開發者也可以直接運行原生SQL語句來滿足復雜的場景需要。關系型數據庫在應用卸載之后,才會被自動清除。
2、運作機制
RDB對外提供通用的接口,底層使用SQLite作為持久化存儲引擎,支持SQLite具有的所有數據庫特性。SQLite是一個進程內的庫,具有自給自足、無服務、零配置、事務性特性的SQL數據庫引擎。RDB包括但不限于事務、索引、視圖、觸發器、外鍵、參數化查詢和預編譯SQL語句。
3、使用場景
- 通訊錄
- 記事本
- 計算器歷史記錄
- App用戶登錄信息
- App主題
- …
4、流程
5、詳細步驟
RDB對開發者提供的接口大部分為異步接口,均有??callback?
?和??Promise?
?兩種返回形式,接下來將會一一介紹。
(1)導入模塊
(2)配置數據庫相關信息
創建數據庫時需要配置數據庫相關信息,RDB提供管理關系型數據庫配置的StoreConfig接口,其參數如表5-1所示:
表5-1 關系型數據庫配置參數.
名稱 | 類型 | 必填 | 說明 |
name | string | 是 | 數據庫文件名 |
securityLevel | SecurityLevel(詳見表5-2) | 是 | 設置數據庫安全級別 |
encrypt | boolean | 否 | 指定數據庫是否加密。 true:加密。 false:非加密。 |
表5-2 數據庫的安全級別枚舉。
名稱 | 值 | 說明 |
S1 | 1 | 數據庫安全級別為低級別,當數據泄露時會產生較低影響。如包含壁紙等系統數據的數據庫。 |
S2 | 2 | 數據庫安全級別為中級別,當數據泄露時會產生較大影響。如包含錄音、視頻等用戶生成數據或通話記錄等信息的數據庫。 |
S3 | 3 | 數據庫安全級別為高級別,當數據泄露時會產生重大影響。如包含用戶運動、健康、位置等信息的數據庫。 |
S4 | 4 | 數據庫安全級別為關鍵級別,當數據泄露時會產生嚴重影響。如包含認證憑據、財務數據等信息的數據庫。 |
(3)創建數據庫
和MySQL、Oracle等數據庫類似,在使用之前需要先創建數據庫,RDB提供了getRdbStore()方法用于創建數據庫,該方法需要傳入應用上下文Context和數據庫配置信息StoreConfig兩個參數,該方法有callback和Promise兩種返回形式,如表5-3所示。表5-3 數據庫創建方法。
方法名 | 描述 |
getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback<RdbStore>): void | 獲得一個相關的RdbStore,操作關系型數據庫。 context: 應用上下文 config: 數據庫配置信息 callback: 回調函數,返回RdbStore對象 |
getRdbStore(context: Context, config: StoreConfig): Promise<RdbStore> | 獲得一個相關的RdbStore,操作關系型數據庫。 context: 應用上下文 config: 數據庫配置信息 Promise<RdbStore>: Promise對象,返回RdbStore對象 |
注:RDB不僅提供了數據庫創建的方法,同時還提供了刪除數據庫方法,可以調用deleteRdbStore()方法進行數據庫刪除,使用方式和getRdbStore()方法類似。
(4)數據表操作
創建數據庫后,獲取到RdbStore實例。RdbStore提供管理RDB方法的接口,在使用其增、刪、改、查等接口之前,需要使用executeSql接口初始化數據表結構和相關數據。
創建數據表
executeSql()方法執行包含指定參數但不返回值得SQL語句,有callback和Promise兩種形式,如表5-4所示。
表5-4 創建數據表方法:
方法名 | 描述 |
executeSql(sql: string,bindArgs: Array<ValueType>, callback: AsyncCallback<void>): void | 執行包含指定參數但不返回值得SQL語句。 sql: 指定要執行得SQL語句 bindArgs: SQL語句中參數的值 callback: 回調函數 |
executeSql(sql: string,bindArgs: Array<ValueType>): Promise<void> | 執行包含指定參數但不返回值得SQL語句。 sql: 指定要執行得SQL語句 bindArgs: SQL語句中參數的值 Promise<void>: 無返回結果的Promise對象 |
注:表中的ValueType用于表示允許的數據字段類型,當前僅支持表示值類型為數字的number,表示值類型為字符的string,表示值類型為布爾值的boolean。
新增數據
RdbStore提供了單條數據插入和批量數據插入兩種為數據表新增數據的方法,如表5-5所示。
表5-5 新增數據方法:
方法名 | 描述 |
insert(table: string, values: ValuesBucket, callback: AsyncCallback<number>):void | 向表中插入一行數據。 table: 插入數據的目標表名稱 values: 插入到表中的數據行 callback: 回調函數。插入成功,返回行ID,否則返回-1 |
insert(table: string, values: ValuesBucket): Promise<number> | 向表中插入一行數據。 table: 插入數據的目標表名稱 values: 插入到表中的數據行 Promise<number>: Promise對象。插入成功,返回行ID,否則返回-1 |
batchInsert(table: string, values: Array<ValuesBucket>, callback: AsyncCallback<number>):void | 向表中插入一組數據 table: 插入數據的目標表名稱 插入到表中的一組數據 callback: 回調函數。插入成功,返回插入的數據個數,否則返回-1 |
batchInsert(table: string, values: Array<ValuesBucket>):Promise<number> | 向表中插入一組數據 table: 插入數據的目標表名稱 插入到表中的一組數據 Promise<number>: Promise對象。插入成功,返回插入的數據個數,否則返回-1 |
注:表5-5中ValuesBucket是用于存儲鍵值對的類型,其鍵為string類型,值類型可為ValueType|Uint8Array|null。
更新數據
RdbStore提供了根據RdbPredicates指定實例對象和根據DataSharePredicates指定實例對象兩種方式更新數據表中的數據,兩種方式均有callback和Promise形式,如表5-6所示。
RdbPredicates和DataSharePredicates均用于數據表中用來代表數據實體的性質、特征或者數據實體之間關系的詞項,主要用于定義數據表的操作條件。如設置根據賬號查找用戶信息的條件,或者根據賬號修改用戶密碼的條件。兩者區別在于使用前者需要先指定操作的數據表名稱,同時前者為分布式數據操作做了擴充。使用后者需要導入新模塊import dataSharePredicates from '@ohos.data.dataSharePredicates'。
表5-6 更新數據方法:
方法名 | 描述 |
update(values: ValuesBucket, predicates: RdbPredicates, callback: AsyncCallback<number>):void | 根據RdbPredicates的指定實例對象更新數據庫中的數據。 values: 數據表中要更新的數據行 predicates: RdbPredicates的實例對象指定的更新條件 callback: 回調函數,返回受影響的行數 |
update(values: ValuesBucket, predicates: RdbPredicates):Promise<number> | 根據RdbPredicates的指定實例對象更新數據庫中的數據。 values: 數據表中要更新的數據行 predicates: RdbPredicates的實例對象指定的更新條件 Promise<number>: Promise對象,返回受影響的行數 |
update(table: string, values: ValuesBucket, predicates: dataSharePredicates.DataSharePredicates, callback: AsyncCallback<number>): void | 根據DataSharePredicates的指定實例對象更新數據表的數據。 table: 更新數據表的名稱 values: 數據表中要更新的數據行 predicates: DataSharePredicates的實例對象指定的更新條件 callback: 回調函數,返回受影響的行數 |
update(table: string, values: ValuesBucket, predicates: dataSharePredicates.DataSharePredicates): Promise<number> | 根據DataSharePredicates的指定實例對象更新數據表的數據。 table: 更新數據表的名稱 values: 數據表中要更新的數據行 predicates: DataSharePredicates的實例對象指定的更新條件 Promise<number>: Promise對象,返回受影響的行數 |
查詢數據
數據表數據的查詢和更新相似,RdbStore也提供了RdbPredicates和DataSharePredicates兩種方式,如表5-7所示。不同之處在于返回的結果不同,更新數據返回受影響的行數,查詢數據返回的數據結果集ResultSet,關于結果集詳細講解將在下一節介紹。
表5-7 查詢數據方法:
方法名 | 描述 |
query(predicates: RdbPredicates, columns: Array<string>, callback: AsyncCallback<ResultSet>): void | 根據RdbPredicates的指定實例對象條件查詢數據表中的數據。 predicates: RdbPredicates的實例對象指定的查詢條件 columns: 查詢的列名稱,為空則表示查詢所有列 callback: 回調函數,操作成功,返回ResultSet對象 |
query(predicates: RdbPredicates, columns: Array<string>): Promise<ResultSet> | 根據RdbPredicates的指定實例對象條件查詢數據表中的數據。 predicates: RdbPredicates的實例對象指定的查詢條件 columns: 查詢的列名稱,為空則表示查詢所有列 Promise<ResultSet>: Promise對象,操作成功,返回ResultSet對象 |
query(table: string, predicates: dataSharePredicates.DataSharePredicates, columns: Array<string>, callback: AsyncCallback<ResultSet>): void | 根據DataSharePredicates的指定實例對象條件查詢數據表中的數據。 table: 查詢數據表名稱 predicates: DataSharePredicates的實例對象指定的查詢條件 columns: 查詢的列名稱,為空則表示查詢所有列 callback: 回調函數,操作成功,返回ResultSet對象 |
query(table: string, predicates: dataSharePredicates.DataSharePredicates, columns: Array<string>): Promise<ResultSet> | 根據DataSharePredicates的指定實例對象條件查詢數據表中的數據。 table: 查詢數據表名稱 predicates: DataSharePredicates的實例對象指定的查詢條件 columns: 查詢的列名稱,為空則表示查詢所有列 Promise<ResultSet>: Promise對象,操作成功,返回ResultSet對象 |
刪除數據
表5-8 刪除數據方法:
方法名 | 描述 |
delete(predicates: RdbPredicates, callback: AsyncCallback<number>):void | 根據RdbPredicates指定實例對象從數據表中刪除數據 predicates: RdbPredicates實例對象指定的刪除條件 callback: 回調函數,返回受影響的行數 |
delete(predicates: RdbPredicates):Promise<number> | 根據RdbPredicates指定實例對象從數據表中刪除數據 predicates: RdbPredicates實例對象指定的刪除條件 Promise<number>: Promise對象,返回受影響的行數 |
delete(table: string, predicates: dataSharePredicates.DataSharePredicates, callback: AsyncCallback<number>):void | 根據DataSharePredicates指定實例對象從數據表中刪除數據 table: 刪除數據的數據表名稱 predicates: DataSharePredicates實例對象指定的刪除條件 callback: 回調函數,返回受影響的行數 |
delete(table: string, predicates: dataSharePredicates.DataSharePredicates):Promise<number> | 根據DataSharePredicates指定實例對象從數據表中刪除數據 table: 刪除數據的數據表名稱 predicates: DataSharePredicates實例對象指定的刪除條件 Promise<number>: 回調函數,返回受影響的行數 |
6、原生SQL操作數據表
RdbStore不僅提供了適用于增刪改查簡單易操作的接口方法,同時還支持原生SQL語句的操作。
- querySql()方法支持使用指定SQL語句查詢數據表中的數據。
7、小節
當然RdbStore還提供了其他的方法,諸如在開始執行SQL語句之前開啟事務的beginTransaction()方法、提交已執行的SQL語句的commit()方法、回滾已執行的SQL語句的rollBack()方法以及用于其他能力的方法。本節僅對RDB數據庫的簡單使用做了講解,其中涉及到RdbPredicates、DataSharePredicates、ResultSet相關的更多內容將在后續封裝RDB工具類中詳細介紹。