生活随笔
收集整理的這篇文章主要介紹了
HarmonyOS之数据管理·关系型数据库的应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、簡介
① 基本概念
關系型數據庫(Relational Database,RDB)是一種基于關系模型來管理數據的數據庫。HarmonyOS 關系型數據庫基于 SQLite 組件提供了一套完整的對本地數據庫進行管理的機制,對外提供了一系列的增、刪、改、查接口,也可以直接運行用戶輸入的 SQL 語句來滿足復雜的場景需要。HarmonyOS 提供的關系型數據庫功能更加完善,查詢效率更高。 關系型數據庫:創建在關系模型基礎上的數據庫,以行和列的形式存儲數據。 謂詞:數據庫中用來代表數據實體的性質、特征或者數據實體之間關系的詞項,主要用來定義數據庫的操作條件。 結果集:指用戶查詢之后的結果集合,可以對數據進行訪問。結果集提供了靈活的數據訪問方式,可以更方便的拿到用戶想要的數據。 SQLite 數據庫:一款輕型的數據庫,是遵守 ACID 的關系型數據庫管理系統,它是一個開源的項目。
② 運作機制
HarmonyOS 關系型數據庫對外提供通用的操作接口,底層使用 SQLite 作為持久化存儲引擎,支持 SQLite 具有的所有數據庫特性,包括但不限于事務、索引、視圖、觸發器、外鍵、參數化查詢和預編譯 SQL 語句。 關系型數據庫運作機制如下圖所示:
③ 配置
如果不指定數據庫的日志模式,那么系統默認日志方式是 WAL(Write Ahead Log)模式。 如果不指定數據庫的落盤模式,那么系統默認落盤方式是 FULL 模式。 HarmonyOS 數據庫使用的共享內存默認大小是 2MB。 數據庫中連接池的最大數量是 4 個,用以管理用戶的讀寫操作。 為保證數據的準確性,數據庫同一時間只能支持一個寫操作。
④ 應用場景
關系型數據庫是在 SQLite 基礎上實現的本地數據操作機制,提供給用戶無需編寫原生 SQL 語句就能進行數據增刪改查的方法,同時也支持原生 SQL 操作。
二、關系型數據庫 API
① 數據庫的創建和刪除
關系型數據庫提供了數據庫創建方式,以及對應的刪除接口,涉及的 API 如下所示:
類名接口名描述 StoreConfig.Builder public builder() 對數據庫進行配置,包括設置數據庫名、存儲模式、日志模式、同步模式,是否為只讀,及對數據庫加密 RdbOpenCallback public abstract void onCreate(RdbStore store) 數據庫創建時被回調,開發者可以在該方法中初始化表結構,并添加一些應用使用到的初始化數據 RdbOpenCallback public abstract void onUpgrade(RdbStore store, int currentVersion, int targetVersion) 數據庫升級時被回調 DatabaseHelper public RdbStore getRdbStore(StoreConfig config, int version, RdbOpenCallback openCallback, ResultSetHook resultSetHook) 根據配置創建或打開數據庫 DatabaseHelper public boolean deleteRdbStore(String name) 刪除指定的數據庫
② 數據庫的加密
關系型數據庫提供數據庫加密的能力,創建數據庫時傳入指定密鑰、創建加密數據庫,后續打開加密數據庫時,需要傳入正確密鑰。 數據庫傳入密鑰接口如下:
類名接口名描述 StoreConfig.Builder Builder setEncryptKey(byte[] encryptKey) 為數據庫配置類設置數據庫加密密鑰,創建或打開數據庫時傳入包含數據庫加密密鑰的配置類,即可創建或打開加密數據庫
③ 數據庫的增刪改查
關系型數據庫提供本地數據增刪改查操作的能力。 新增:關系型數據庫提供了插入數據的接口,通過 ValuesBucket 輸入要存儲的數據,通過返回值判斷是否插入成功,插入成功時返回最新插入數據所在的行號,失敗則返回-1。數據庫插入 API 如下所示:
類名接口名描述 RdbStore long insert(String table, ValuesBucket initialValues) 向數據庫插入數據。table:待添加數據的表名。initialValues:以ValuesBucket存儲的待插入的數據。它提供一系列put方法,如putString(String columnName, String values),putDouble(String columnName, double value),用于向ValuesBucket中添加數據
更新:調用更新接口,傳入要更新的數據,并通過 AbsRdbPredicates 指定更新條件。該接口的返回值表示更新操作影響的行數。如果更新失敗,則返回 0。數據庫更新 API 如下:
類名接口名描述 RdbStore int update(ValuesBucket values, AbsRdbPredicates predicates) 更新數據庫表中符合謂詞指定條件的數據。 values:以ValuesBucket存儲的要更新的數據。 predicates:指定了更新操作的表名和條件。AbsRdbPredicates的實現類有兩個:RdbPredicates和RawRdbPredicates。RdbPredicates:支持調用謂詞提供的equalTo等接口,設置更新條件。RawRdbPredicates:僅支持設置表名、where條件子句、whereArgs三個參數,不支持equalTo等接口調用
刪除:調用刪除接口,通過 AbsRdbPredicates 指定刪除條件,該接口的返回值表示刪除的數據行數,可根據此值判斷是否刪除成功。如果刪除失敗,則返回 0。數據庫刪除 API 如下:
類名接口名描述 RdbStore int delete(AbsRdbPredicates predicates) 刪除數據。 predicates:Rdb謂詞,指定了刪除操作的表名和條件。 AbsRdbPredicates的實現類有兩個:RdbPredicates和RawRdbPredicates。RdbPredicates:支持調用謂詞提供的equalTo等接口,設置更新條件。RawRdbPredicates:僅支持設置表名、where條件子句、whereArgs三個參數,不支持equalTo等接口調用
查詢:關系型數據庫提供了兩種查詢數據的方式: 直接調用查詢接口,使用該接口,會將包含查詢條件的謂詞自動拼接成完整的 SQL 語句進行查詢操作,無需用戶傳入原生的 SQL。 數據庫查詢 API 如下:
類名接口名描述 RdbStore ResultSet query(AbsRdbPredicates predicates, String[] columns) 查詢數據。 predicates:謂詞,可以設置查詢條件。AbsRdbPredicates的實現類有兩個RdbPredicates和RawRdbPredicates。 RdbPredicates:支持調用謂詞提供的equalTo等接口,設置查詢條件。 RawRdbPredicates:僅支持設置表名、where條件子句、whereArgs三個參數,不支持equalTo等接口調用。 columns:規定查詢返回的列。 RdbStore ResultSet querySql(String sql, String[] sqlArgs) 執行原生的用于查詢操作的SQL語句。 sql:原生用于查詢的sql語句。sqlArgs:sql語句中占位符參數的值,若select語句中沒有使用占位符,該參數可以設置為null
④ 數據庫謂詞的使用
關系型數據庫提供了用于設置數據庫操作條件的謂詞 AbsRdbPredicates,其中包括兩個實現子類 RdbPredicates 和 RawRdbPredicates: RdbPredicates:開發者無需編寫復雜的 SQL 語句,僅通過調用該類中條件相關的方法,如 equalTo、notEqualTo、groupBy、orderByAsc、beginsWith 等,就可自動完成SQL 語句拼接,方便用戶聚焦業務操作。 RawRdbPredicates:可滿足復雜 SQL 語句的場景,支持開發者自己設置 where 條件子句和 whereArgs 參數。不支持 equalTo 等條件接口的使用。 數據庫謂詞 API 如下:
類名接口名描述 RdbPredicates RdbPredicates equalTo(String field, String value) 設置謂詞條件,滿足field字段與value值相等 RdbPredicates RdbPredicates notEqualTo(String field, String value) 設置謂詞條件,滿足field字段與value值不相等 RdbPredicates RdbPredicates beginsWith(String field, String value) 設置謂詞條件,滿足field字段以value值開頭 RdbPredicates RdbPredicates between(String field, int low, int high) 設置謂詞條件,滿足field字段在最小值low和最大值high之間 RdbPredicates RdbPredicates orderByAsc(String field) 設置謂詞條件,根據field字段升序排列 RawRdbPredicates void setWhereClause(String whereClause) 設置where條件子句 RawRdbPredicates void setWhereArgs(List whereArgs) 設置whereArgs參數,該值表示where子句中占位符的值
⑤ 查詢結果集的使用
關系型數據庫提供了查詢返回的結果集 ResultSet,指向查詢結果中的一行數據,供用戶對查詢結果進行遍歷和訪問。ResultSet 的對外 API 如下表格:
類名接口名描述 ResultSet boolean goTo(int offset) 從結果集當前位置移動指定偏移量 ResultSet boolean goToRow(int position) 將結果集移動到指定位置 ResultSet boolean goToNextRow() 將結果集向后移動一行 ResultSet boolean goToPreviousRow() 將結果集向前移動一行 ResultSet boolean isStarted() 判斷結果集是否被移動過 ResultSet boolean isEnded() 判斷結果集當前位置是否在最后一行之后 ResultSet boolean isAtFirstRow() 判斷結果集當前位置是否在第一行 ResultSet boolean isAtLastRow() 判斷結果集當前位置是否在最后一行 ResultSet int getRowCount() 獲取當前結果集中的記錄條數 ResultSet int getColumnCount() 獲取結果集中的列數 ResultSet String getString(int columnIndex) 獲取當前行指定索列的值,以String類型返回 ResultSet byte[] getBlob(int columnIndex) 獲取當前行指定列的值,以字節數組形式返回 ResultSet double getDouble(int columnIndex) 獲取當前行指定列的值,以double型返回
⑥ 事務
關系型數據庫提供事務機制,來保證用戶操作的原子性。對單條數據進行數據庫操作時,無需開啟事務;插入大量數據時,開啟事務可以保證數據的準確性。如果中途操作出現失敗,會執行回滾操作。 事務 API 如下:
類名接口名描述 RdbStore beginTransaction() 開啟事務 RdbStore markAsCommit() 設置事務的標記為成功 RdbStore endTransaction() 結束事務
⑦ 事務和結果集觀察者
關系型數據庫提供了事務和結果集觀察者能力,當對應的事件被觸發時,觀察者會收到通知。 API 如下所示:
類名接口名描述 RdbStore beginTransactionWithObserver(TransactionObserver transactionObserver) 開啟事務,并觀察事務的啟動、提交和回滾 ResultSet void registerObserver(DataObserver observer) 注冊結果集的觀察者 ResultSet void unregisterObserver(DataObserver observer) 注銷結果集的觀察者
⑧ 數據庫的備份和恢復
用戶可以將當前數據庫的數據進行保存進行備份,還可以在需要的時候進行數據恢復。 數據庫備份和恢復 API 如下:
類名接口名描述 RdbStore boolean restore(String srcName) 數據庫恢復接口,從指定的非加密數據庫文件中恢復數據 RdbStore boolean restore(String srcName, byte[] srcEncryptKey, byte[] destEncryptKey) 數據庫恢復接口,從指定的數據庫文件(加密和非加密均可)中恢復數據 RdbStore boolean backup(String destName) 數據庫備份接口,備份出的數據庫文件是非加密的 RdbStore boolean backup(String destName, byte[] destEncryptKey) 數據庫備份接口,此方法經常用在備份出加密數據庫場景
三、關系型數據庫的使用
① 創建數據庫
配置數據庫相關信息,包括數據庫的名稱、存儲模式、是否為只讀模式等。 初始化數據庫表結構和相關數據。 創建數據庫。
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
) ;
② 插入數據
構造要插入的數據,以 ValuesBucket 形式存儲。 調用關系型數據庫提供的插入接口。
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
) ;
③ 查詢數據
構造用于查詢的謂詞對象,設置查詢條件。 指定查詢返回的數據列。 調用查詢接口查詢數據。 調用結果集接口,遍歷返回結果。
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的關系型數據庫操作方法。
總結
以上是生活随笔 為你收集整理的HarmonyOS之数据管理·关系型数据库的应用 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。