【最新鴻蒙應用開發】——關系型數據庫簡單上手(RDB)

關系型數據庫(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)}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21510.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21510.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21510.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【cocos sreator】判定多邊形和多邊形相交

核心代碼: cc.Intersection.polygonPolygon(points2, points) 拖拽物品拖到多個目標位置判定,取最近的: getTargetItem(collider2: cc.PolygonCollider, touchPos: cc.Vec2, targetRoot: cc.Node) {let length 99999;let target null;//col…

windows 下編譯 TessRact+leptonica 識別圖片文字

目錄 1、下載 2. 編譯基礎依賴庫 1.1 zlib 1.2 jpegsr9f 1.3 lpng1643 1.4 libgif 3. 編譯tifflib 4. 配置nasm到系統環境中 5. 編譯 libjpeg-turbo 6 編譯leptonica 7. 編譯tesseract 8. 測試驗證 1、下載 下載tesseract5.3.2 下載leptonica1.83.1 下載l…

1638. 統計只差一個字符的子串數目

題目 給你兩個字符串 s 和 t,請找出 s 中的非空子串的數目,這些子串滿足替換一個不同字符以后,是 t 串的子串。換言之,請你找到 s 和 t 串中恰好只有一個字符不同的子字符串對的數目。 一個子字符串是一個字符串中連續的字符。 …

【全開源】旅游門票預訂系統(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp開發的旅游門票預訂系統,支持景點門票、導游產品便捷預訂、美食打卡、景點分享、旅游筆記分享等綜合系統,提供前后臺無加密源碼,支持私有化部署。 ?便捷你的每一次出行🌍 🌟 輕松預訂…

PMP中的各種圖

單、雙代號網絡圖 區別 內容 箭線圖(ADM)-雙 箭線活動 節點依賴關系 箭線圖只能表示一種FS的關系 規劃和控制項目活動進度的項目 (建筑、軟件) 前導圖(PDM)-單 節點代表活動 前導圖法可以體現多種邏…

語義化版本控制:軟件工程的實用之道

語義化版本控制:軟件工程的實用之道 在軟件開發過程中,版本控制是確保項目穩定、有序進行的關鍵環節。隨著項目的發展,功能的增加、錯誤的修復以及API的修改變得日益頻繁。為了有效管理這些變化,并確保團隊成員、用戶以及依賴該軟…

Python中的上下文管理:深入探索contextlib模塊

Python中的上下文管理:深入探索contextlib模塊 在Python編程中,上下文管理器扮演著至關重要的角色,它們允許我們以一種非常優雅和高效的方式來管理資源,如文件操作、鎖的獲取與釋放等。contextlib模塊是Python標準庫中的一個模塊…

骨傳導藍牙耳機買哪款好?年度精選五款骨傳導藍牙耳機推薦

作為音樂愛好者的我,也一直在尋找一款好的骨傳導耳機,聽音樂對我來說不僅僅是一種消遣方式,更多是一種對生活、工作上壓力和困難的舒緩,所以今天給大家推薦幾款骨傳導耳機。今天推薦這幾款骨傳導耳機都是比較有性價比,…

計算機網絡學習實踐:模擬RIP動態路由

計算機網絡學習實踐:模擬RIP動態路由 模擬動態路由RIP協議 1.實驗準備 實驗環境:華為模擬器ENSP 實驗設備: 3個路由器,3個二層交換機(不是三層的),3個PC機 5個網段 192.168.1.0 255.255.…

【Linux】文件IO基礎

man手冊 通過man手冊可以獲取詳細的Linux操作命令共有8章,查詢使用man ls即可查詢ls的相應命令,也可以使用相應的章節man 2 open查詢第二章的open如何使用。 常用文件IO函數 功能函數描述實例打開文件int open(const char *pathname, int flags);打開…

21data 數據可視化 代碼合集

<!-- <!DOCTYPE html> <html> <head><title>視覺映射和圖例</title><meta charset"utf-8"><script src"echarts.js"></script> </head> <body> <div style"width: 600px;height:4…

電腦視頻錄制工具,推薦3款,讓你的作品更專業!

隨著信息技術的飛速發展&#xff0c;電腦視頻錄制工具在日常工作和娛樂中扮演著越來越重要的角色。它們不僅能幫助我們記錄電腦屏幕上的精彩瞬間&#xff0c;還能為教學、演示、游戲直播等多種場景提供便利。本文將詳細介紹三款電腦視頻錄制工具&#xff0c;并分步驟闡述它們的…

【TB作品】msp430f5529單片機,dht22,煙霧傳感器

功能 //硬件&#xff1a;msp430f5529、dht22、LCD1602、蜂鳴器、煙霧傳感器、藍牙模塊。 //功能&#xff1a;讀取溫濕度、煙霧濃度顯示到屏幕&#xff1b; //按鍵調節三個報警數值&#xff1b; //溫度、濕度、煙霧濃度&#xff0c;任意一個大于報警數值就蜂鳴器報警&#xff1…

如何編輯pdf文件內容?編輯技巧大揭秘,秒變辦公達人!

如何編輯pdf文件內容&#xff1f;在數字化辦公日益普及的今天&#xff0c;PDF文件因其跨平臺、格式穩定的特點&#xff0c;成為我們日常工作和學習中不可或缺的一部分。然而&#xff0c;PDF文件的編輯卻常常令人頭疼&#xff0c;許多人面對需要修改內容的PDF文件時感到無從下手…

【RPG Maker MV 仿新仙劍 戰斗場景UI (九)】

RPG Maker MV 仿新仙劍 戰斗場景UI 九 前言角色戰斗精靈精靈圖設置攻擊 戰斗背景圖 前言 前段天研究并完成了主角人物行走圖部分的開發&#xff0c;完成了對應的8方向行走&#xff0c;及精靈的展示。現在開始重新回到戰斗場景的開發中&#xff0c;回顧下&#xff0c;已完成功能…

如何手動批準內核擴展 Tuxera NTFS for mac內核擴展需要批準 內核擴展怎么打開

在了解如何手動批準內核擴展之前&#xff0c;我們應該先了解什么叫做內核擴展。內核擴展又被稱為KEXT&#xff0c;通過它可以實現macOS系統與軟件組件之間的交互&#xff0c;例如磁盤管理、任務管理和內存管理等等。 kext 是內核擴展&#xff08;Kernel Extension&#xff09;…

【漏洞復現】海康威視綜合安防管理平臺 orgManage/v1/orgs/download 任意文件讀取漏洞復現

0x01 產品簡介 海康威視綜合安防管理平臺是一套“集成化”、“智能化”的平臺,通過接入視頻監控、一卡通、停車場、報警檢測等系統的設備。海康威視集成化綜合管理軟件平臺,可以對接入的視頻監控點集中管理,實現統一部署、統一配置、統一管理和統一調度。 0x02 漏洞概述 海康…

C語言:學生成績管理系統(含源代碼)

一.功能 二.源代碼 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NUM 100 typedef struct {char no[30];char name[10];char sex[10];char phone[20];float cyuyan;float computer;float datastruct; } *student, student1;typ…

滲透測試報告生成工具

目錄 1.前言 1.1 滲透測試報告是什么? 1.2 滲透測試報告的編寫需要考慮以下幾點&#xff1a; 1.3 一份優秀的滲透測試報告應該具備以下特點&#xff1a; 1.4 在編寫滲透測試報告之前&#xff0c;需要進行一些準備工作&#xff1a; 1.5 滲透測試報告一般包括以下部分&…

作為表達式調用時,無法解析類修飾器的簽名。vue3+ts+vite,使用裝飾器時報錯

作為表達式調用時&#xff0c;無法解析類修飾器的簽名。 The runtime will invoke the decorator with 2 arguments, but the decorator expects 1.ts(1238) 頁面也無法打開 解決方案&#xff1a; {"extends": "vue/tsconfig/tsconfig.dom.json","in…