關系型數據庫(RDB)
關系型數據庫(Relational Database,RDB)是一種基于關系模型來管理數據的數據庫。關系型數據庫基于SQLite組件提供了一套完整的對本地數據庫進行管理的機制,對外提供了一系列的增、刪、改、查等接口,也可以直接運行用戶輸入的SQL語句來滿足復雜的場景需要。不支持Worker線程。 ArkTS側支持的基本數據類型:number、string、二進制類型數據、boolean。為保證插入并讀取數據成功,建議一條數據不要超過2M。超出該大小,插入成功,讀取失敗。
該模塊提供以下關系型數據庫相關的常用功能:
-
RdbPredicates: 數據庫中用來代表數據實體的性質、特征或者數據實體之間關系的詞項,主要用來定義數據庫的操作條件。
-
RdbStore:提供管理關系數據庫(RDB)方法的接口。
-
ResultSet:提供用戶調用關系型數據庫查詢接口之后返回的結果集合。
說明:
1、導入模塊
包不要導錯了,API9的版本:
import relationalStore from '@ohos.data.relationalStore'; //舊版API,不建議使用
-
建議使用最新的API11:
import { relationalStore, ValuesBucket } from '@kit.ArkData'
2、創建數據庫文件
Button('創建數據庫文件').onClick(async () => {// 獲取操作數據庫的管理對象(如果數據庫文件不存在,會自動創建數據庫文件)const store = await relationalStore.getRdbStore(getContext(), {name: 'RDB.db', // 數據庫文件名securityLevel: relationalStore.SecurityLevel.S1, // 數據庫安全級別})// 執行創建表的語句 execute 執行store.executeSql(this.sqlCreate)AlertDialog.show({ message: '創建成功' })})
注意:需要獲取數據庫管理對象,才能進行增刪改查操作
?// 獲取數據庫管理對象async getStoreInstance() {// 如果已經存在,直接返回if (this.store) {return this.store}// 獲取操作數據庫的管理對象(如果數據庫文件不存在,會自動創建數據庫文件)this.store = await relationalStore.getRdbStore(getContext(), {name: 'RDB.db', // 數據庫文件名securityLevel: relationalStore.SecurityLevel.S1, // 數據庫安全級別})// 執行創建表的語句 execute 執行this.store.executeSql(this.sqlCreate)// 返回 store 對象return this.store}
3、查詢數據庫表的字段
Button('查詢數據庫表的字段').onClick(async () => {// 獲取操作數據庫的對象const store = await this.getStoreInstance()// 謂詞(條件),謂詞類需要 new 實例化,傳入表名 privacy_noteconst predicates = new relationalStore.RdbPredicates(this.tableName)// query 查詢,傳入必傳參數 謂詞const resultSet = await store.query(predicates)AlertDialog.show({ message: '數據庫的字段名:' + resultSet.columnNames })})
4、新插入一條數據
Button('新建一條數據').onClick(async () => {// 獲取操作數據庫的對象const store = await this.getStoreInstance()// 添加一條數據const id = await store.insert(this.tableName, {id: null, // 新增時設置 id 為空值 null,用于自增 idtitle: '關鍵的問題',content: '111',date_added: Date.now()} as NoteItem)AlertDialog.show({ message: '新增數組成功,數據的id為:' + id })// 批量添加,傳入數組// store.batchInsert(表名, 數組)})
5、修改數據
Button('更新(修改)數據').onClick(async () => {// 獲取操作數據庫對象const store = await this.getStoreInstance()// 謂詞(條件)const predicates = new relationalStore.RdbPredicates(this.tableName)// 注意!!!:記得添加 predicates 限定條件,否者修改全部predicates.equalTo('id', 10)// 待更新數據const value = {title: '新的標題',content: '新的內容'} as NoteItemconst affectedRows = await store.update(value, predicates)AlertDialog.show({ message: '更新(修改)數據 - 受影響行數:' + affectedRows })})
5、刪除數據庫文件(不推薦使用delete,建議設置為空值即可)
Button('刪除數據庫文件').enabled(false).onClick(async () => {try {await relationalStore.deleteRdbStore(getContext(), 'heima.db')AlertDialog.show({ message: '刪除成功' })} catch (error) {AlertDialog.show({ message: JSON.stringify(error, null, 2) })}})
6、最后,獻上完整代碼
import { relationalStore, ValuesBucket } from '@kit.ArkData'
?
// ValuesBucket 數據庫支持的類型
interface NoteItem extends ValuesBucket {id: number | null // 新增時設置 id 為空值 null,用于自增 idtitle: stringcontent: stringdate_added: number
}
?
@Entry
@Component
struct RdbStoreTestPage {// 表名tableName: string = 'privacy_note'// SQL 語法:(SQL語法的數據類型關鍵詞不一樣,可通過AI生成SQL語句)// 解釋說明:// ? CREATE TABLE IF NOT EXISTS ? ? 如果表不存在才創建新的表// ? INTEGER -> number ? ? ? ? ? ? INTEGER 整數型 ? FLOAT 浮點數// ? PRIMARY KEY ? ? ? ? ? ? ? ? ? 主鍵(唯一標識)// ? AUTOINCREMENT ? ? ? ? ? ? ? ? 自增// ? TEXT -> string ? ? ? ? ? ? ? ? 字符串型// ? NOT NULL ? ? ? ? ? ? ? ? ? ? ? 不允許空sqlCreate: string = `CREATE TABLE IF NOT EXISTS ${this.tableName} (id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT NOT NULL,content TEXT NOT NULL,date_added INTEGER NOT NULL)`// 操作數據庫的管理對象store: relationalStore.RdbStore | null = null
?// 獲取數據庫管理對象async getStoreInstance() {// 如果已經存在,直接返回if (this.store) {return this.store}// 獲取操作數據庫的管理對象(如果數據庫文件不存在,會自動創建數據庫文件)this.store = await relationalStore.getRdbStore(getContext(), {name: 'rdb.db', // 數據庫文件名securityLevel: relationalStore.SecurityLevel.S1, // 數據庫安全級別})// 執行創建表的語句 execute 執行this.store.executeSql(this.sqlCreate)// 返回 store 對象return this.store}
?build() {Navigation() {Scroll() {Column({ space: 10 }) {Button('創建數據庫文件').onClick(async () => {// 獲取操作數據庫的管理對象(如果數據庫文件不存在,會自動創建數據庫文件)const store = await relationalStore.getRdbStore(getContext(), {name: 'heima.db', // 數據庫文件名securityLevel: relationalStore.SecurityLevel.S1, // 數據庫安全級別})// 執行創建表的語句 execute 執行store.executeSql(this.sqlCreate)AlertDialog.show({ message: '創建成功' })})Button('查詢數據庫表的字段').onClick(async () => {// 獲取操作數據庫的對象const store = await this.getStoreInstance()// 謂詞(條件),謂詞類需要 new 實例化,傳入表名 privacy_noteconst predicates = new relationalStore.RdbPredicates(this.tableName)// query 查詢,傳入必傳參數 謂詞const resultSet = await store.query(predicates)AlertDialog.show({ message: '數據庫的字段名:' + resultSet.columnNames })})Button('新建一條數據').onClick(async () => {// 獲取操作數據庫的對象const store = await this.getStoreInstance()// 添加一條數據const id = await store.insert(this.tableName, {id: null, // 新增時設置 id 為空值 null,用于自增 idtitle: '哈哈哈呵呵呵',content: '111',date_added: Date.now()} as NoteItem)AlertDialog.show({ message: '新增數組成功,數據的id為:' + id })// 批量添加,傳入數組// store.batchInsert(表名, 數組)})Button('查詢所有數據').onClick(async () => {// 獲取操作數據庫的對象const store = await this.getStoreInstance()// 謂詞(條件)const predicates = new relationalStore.RdbPredicates(this.tableName)predicates.orderByDesc('id') // 倒序(由大到小,常用于排序)// predicates.orderByAsc('id') ? // 正序(小到大,常用于排序)// predicates.equalTo('id', 1) ? // 等于(常用于詳情頁)// predicates.in('id', [1, 3, 5]) // 查找多項(常用批量刪除)// predicates.like('title', '%哈%') // 模糊匹配(常用于搜索)// 還有很多...// predicates.greaterThan('id', 3)// resultSet 結果集const resultSet = await store.query(predicates)// 準備一個數組,用于存儲數據庫提取的數據const list: NoteItem [] = []// resultSet.goToNextRow() ? 指針移動到下一行while (resultSet.goToNextRow()) {// 移動指針的時候提取數據,按列下標提取數據list.push({// resultSet.getColumnIndex() ? ? ? 根據列名稱獲取下標(索引)id: resultSet.getLong(resultSet.getColumnIndex('id')),title: resultSet.getString(resultSet.getColumnIndex('title')),content: resultSet.getString(resultSet.getColumnIndex('content')),date_added: resultSet.getLong(resultSet.getColumnIndex('date_added')),})}// 循環結束后,獲取所有數據AlertDialog.show({ message: JSON.stringify(list, null, 2) })})
?Button('查詢數據總條數').onClick(async () => {// 獲取操作數據庫對象const store = await this.getStoreInstance()// 謂詞(條件)const predicates = new relationalStore.RdbPredicates(this.tableName)// 結果集const resultSet = await store.query(predicates)AlertDialog.show({ message: '數據總條(行)數 rowCount:' + resultSet.rowCount })})
?Button('刪除數據').onClick(async () => {// 獲取操作數據庫對象const store = await this.getStoreInstance()const predicates = new relationalStore.RdbPredicates(this.tableName)// 注意!!!:記得添加 predicates 限定條件,否者會刪除所有數據// predicates.equalTo('id', 2) ? ? ? // equalTo 刪除一條predicates.in('id', [1, 2, 3, 4, 5]) // in ? ? 批量刪除const affectedRows = await store.delete(predicates)AlertDialog.show({ message: '受影響行數:' + affectedRows })})
?Button('更新(修改)數據').onClick(async () => {// 獲取操作數據庫對象const store = await this.getStoreInstance()// 謂詞(條件)const predicates = new relationalStore.RdbPredicates(this.tableName)// 注意!!!:記得添加 predicates 限定條件,否者修改全部predicates.equalTo('id', 10)// 待更新數據const value = {title: '新的標題',content: '新的內容'} as NoteItemconst affectedRows = await store.update(value, predicates)AlertDialog.show({ message: '更新(修改)數據 - 受影響行數:' + affectedRows })})// Button('刪除數據庫文件')// ? .enabled(false)// ? .onClick(async () => {// ? ? try {// ? ? ? await relationalStore.deleteRdbStore(getContext(), 'heima.db')// ? ? ? AlertDialog.show({ message: '刪除成功' })// ? ? } catch (error) {// ? ? ? AlertDialog.show({ message: JSON.stringify(error, null, 2) })// ? ? }// ? })}.constraintSize({ minHeight: '100%' })}.width('100%').height('100%')}.title('關系型數據庫').titleMode(NavigationTitleMode.Mini)}
}