HarmonyOS NEXT 鴻蒙中關系型數據庫@ohos.data.relationalStore API 9+

核心API

@ohos.data.relationalStore API 9+

數據庫

數據庫是存儲和管理數據的系統

數據庫(Database)是一個以特定方式組織、存儲和管理數據的集合,通常用于支持各種應用程序和系統的運行。它不僅是存放數據的倉庫,還通過一定的規則和結構來確保數據的高效查詢和管理。?

數據庫的核心特點

  1. ?數據存儲?:數據庫可以存儲大量數據,從百萬條到上億條不等,且數據按特定規則組織,以提高查詢效率。
  2. ?數據管理?:數據庫通過數據庫管理系統(DBMS)進行統一管理,確保數據的安全性、完整性和一致性。
  3. ?數據共享?:數據庫支持多用戶同時訪問,且數據可以被多個應用程序共享和使用。

數據庫的常見類型

  1. ?關系型數據庫?:基于關系模型,數據以表格形式存儲,支持SQL語言進行復雜查詢,如MySQL、Oracle等。
  2. ?非關系型數據庫(NoSQL)?:適用于非結構化或半結構化數據,具有更好的橫向擴展能力,如MongoDB、Redis等。

鴻蒙的關系型數據庫用法?@ohos.data.relationalStore?API 9+

關系型數據庫(Relational Database,RDB)是一種基于關系模型來管理數據的數據庫。關系型數據庫基于SQLite組件提供了一套完整的對本地數據庫進行管理的機制,對外提供了一系列的增、刪、改、查等接口,也可以直接運行用戶輸入的SQL語句來滿足復雜的場景需要。支持通過ResultSet.getSendableRow方法獲取Sendable數據,進行跨線程傳遞。

為保證插入并讀取數據成功,建議一條數據不要超過2M。超出該大小,插入成功,讀取失敗。

大數據量場景下查詢數據可能會導致耗時長甚至應用卡死,如有相關操作可參考文檔批量數據寫數據庫場景,且有建議如下:

  • 單次查詢數據量不超過5000條。
  • 在TaskPool中查詢。
  • 拼接SQL語句盡量簡潔。
  • 合理地分批次查詢。

該模塊提供以下關系型數據庫相關的常用功能:

  • RdbPredicates: 數據庫中用來代表數據實體的性質、特征或者數據實體之間關系的詞項,主要用來定義數據庫的操作條件。
  • RdbStore:提供管理關系數據庫(RDB)方法的接口。
  • ResultSet:提供用戶調用關系型數據庫查詢接口之后返回的結果集合。
  • Transaction:提供管理事務對象的接口。

使用數據庫封裝一個數據庫工具,用于存儲錄音

在之前的文章中,我們完成了一些錄音和播放的功能,但是目前只能現錄現播。如果我們想把錄音數據存起來,這時候用關系型數據庫就比較合適。

  1. 首先我們要準備好要存儲的數據類型,并且繼承數據庫提供的“桶”類型ValuesBucket
  2. 要有一個初始化數據庫的方法,獲取上下文,并判斷是否獲取到上下文
  3. 如果數據庫不存在就創建relationalStore.getRdbStore,存在就不創建
  4. store.executeSql在數據庫中創建或打開表,SQL語句可以去用AI生成
  5. 需要增刪改查四個方法
  6. 增:直接傳入要添加的數據
  7. 刪:創建謂詞對象,傳入Id,根據id找到行,然后刪除
  8. 改:創建謂詞對象,傳入整個對象,找到修改行,更新
  9. 查:創建謂詞對象,傳入user_Id,采用游標移動取值,循環到沒有下一行為止,每一次循環都在數組中追加當前的行,最后返回一個數組。
import { relationalStore, ValuesBucket } from "@kit.ArkData"
import { InterviewAudioItem } from "../../models"export interface InterviewAudioItem extends ValuesBucket {id: number | nulluser_id: stringname: stringpath: stringduration: numbersize: numbercreate_time: number
}class AudioDB {store?: relationalStore.RdbStoretableName = 'success_audio'// 1. 初始化數據庫和數據庫表async initStore() {// 1.0 獲取上下文const ctx = AppStorage.get<Context>('context')if (ctx) {// 1.1 創建數據庫// 有則獲取, 沒有則創建const store = await relationalStore.getRdbStore(ctx, {name: 'interview_audio.db',securityLevel: relationalStore.SecurityLevel.S1})// 1.2 在數據庫中創建一張數據庫表store.executeSql(`CREATE TABLE IF NOT EXISTS ${this.tableName} (id INTEGER PRIMARY KEY AUTOINCREMENT,user_id TEXT NOT NULL,name TEXT NOT NULL,path TEXT NOT NULL,duration INTEGER NOT NULL,size INTEGER NOT NULL,create_time INTEGER NOT NULL)`)this.store = store}}// 2. 添加一條音頻數據async insert(item: InterviewAudioItem) {if (this.store) {const rowId = await this.store.insert(this.tableName, item)if (rowId === undefined || rowId === -1) {return Promise.reject('插入音頻數據失敗')} else {return Promise.resolve()}}}// 3. 刪除一條音頻數據async delete(audioId: number) {if (this.store) {const predicates = new relationalStore.RdbPredicates(this.tableName)predicates.equalTo('id', audioId)const rowId = await this.store.delete(predicates)if (rowId === undefined || rowId === -1) {return Promise.reject('刪除音頻數據失敗')} else {return Promise.resolve()}}}// 4. 修改一條音頻數據async update(item: InterviewAudioItem) {if (this.store) {const predicates = new relationalStore.RdbPredicates(this.tableName)predicates.equalTo('id', item.id)const rowId = await this.store.update(item, predicates)if (rowId === undefined || rowId === -1) {return Promise.reject('修改音頻數據失敗')} else {return Promise.resolve()}}}// 5. 根據用戶id查詢用戶所有的錄音數據async query(userId: string) {if (this.store) {// 1. 創建一個基于查詢條件的謂詞對象const predicates = new relationalStore.RdbPredicates(this.tableName)predicates.equalTo('user_id', userId)// 2. 執行數據庫查詢得到結果集const resultSet = await this.store.query(predicates)if (!resultSet) {return Promise.reject('query fail')}// 3. 采用游標移動取值const list: InterviewAudioItem[] = []// 3.1 如果有下一行, 則繼續循環while (resultSet?.goToNextRow()) {list.push(resultSet.getRow() as InterviewAudioItem)}// 3.2 關閉查詢結果集resultSet.close()return Promise.resolve(list)}return Promise.reject('暫無數據庫')}
}export const audioDB = new AudioDB()

這樣一個完整功能的數據庫工具就創建好了,那么我們就直接去把錄音存到數據庫中吧!

在錄音頁面中使用數據庫保存數據

首先在頁面開始時初始化數據庫

  async aboutToAppear() {await this.getPermission()// 2. 初始化數據庫await audioDB.initStore()}

?初始化完成可以在設備管理器中看到三個數據庫相關文件

在錄制開始的函數中,我們記錄下開始時間

在點擊結束錄制的時候,我們再額外調用一個方法,傳入音頻類型的項,調用數據庫方法插入數據庫中。

// 存入數據庫方法async onRecordEnd(item: InterviewAudioItem) {await audioDB.insert(item)AlertDialog.show({ message: '錄音保存成功' })}Button('停止錄制').onClick(() => {this.stopRecord()// 以只讀的方式根據路徑打開文件const file = fileIo.openSync(this.filePath, fileIo.OpenMode.READ_ONLY)const stat = fileIo.statSync(file.fd)this.onRecordEnd({id: null,user_id: auth.getUser().id,name: dayjs().format('YYYY年MM月DD日_hh點mm分ss秒'),path: this.filePath || '',duration: Date.now() - this.startTime,create_time: Date.now(),size: stat.size})promptAction.showToast({ message: '停止錄制' })})

?點擊開始錄音錄制一段時間,然后結束錄制

這樣一條數據就被插入了數據庫表中,對比數據庫文件發現,確實比之前大了,就說明已經插入完成,因為沒有可視化打開數據庫的工具,所有無法具體查看數據表的內容。

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

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

相關文章

步進電機 cia402協議 報文自己的理解 (筆記)

1. cai402 協議是什么 CiA 402 協議&#xff08;CAN in Automation 402&#xff09;&#xff0c;它是工業自動化領域中的一種通信協議&#xff0c;主要用于運動控制&#xff08;如伺服驅動器、步進電機等&#xff09;&#xff08; &#xff09;所屬標準 CiA 402 是 CANopen 應用…

鴻蒙攝像機,一場智能安防的“平權革命”

2025的春天&#xff0c;全國各行各業都感受到了普惠AI的魅力。大模型帶來的技術平權&#xff0c;讓每一個人都能輕松用上AI。 這時候&#xff0c;企業想知道&#xff0c;每時每刻離不開的攝像機&#xff0c;究竟什么時候才能迎來智能技術的平權與普惠。 博思數據研究中心的一份…

解決HuggingFaceEmbeddings模型加載報錯:缺少sentence-transformers依賴包

遇到報錯 報錯信息: Error loading model: Could not import sentence_transformers python package. Please install it with pip install sentence-transformers. 裝包信息&#xff1a; pip install modelscope langchain sentence_transformers langchain-huggingface on…

從泛讀到精讀:合合信息文檔解析如何讓大模型更懂復雜文檔

從泛讀到精讀&#xff1a;合合信息文檔解析如何讓大模型更懂復雜文檔 一、引言&#xff1a;破解文檔“理解力”瓶頸二、核心功能&#xff1a;合合信息的“破局”亮點功能亮點1&#xff1a;復雜圖表的高精度解析圖表解析&#xff1a;為大模型裝上精準“標尺”表格數據精準還原 功…

Python+requests實現接口自動化測試框架

為什么要做接口自動化框架 1、業務與配置的分離 2、數據與程序的分離&#xff1b;數據的變更不影響程序 3、有日志功能&#xff0c;實現無人值守 4、自動發送測試報告 5、不懂編程的測試人員也可以進行測試 正常接口測試的流程是什么&#xff1f; 確定接口測試使用的工具…

信息學奧賽一本通 1514:【例 2】最大半連通子圖 | 洛谷 P2272 [ZJOI2007] 最大半連通子圖

【題目鏈接】 ybt 1514&#xff1a;【例 2】最大半連通子圖 洛谷 P2272 [ZJOI2007] 最大半連通子圖 【題目考點】 1. 圖論&#xff1a;強連通分量 縮點 2. 圖論&#xff1a;拓撲排序 有向無環圖動規 【解題思路】 對于圖中任意兩頂點u、v&#xff0c;滿足u到v或v到u有路徑…

Android打aar包問題總結

1、moduleA 依賴 moduleB&#xff0c;將moduleA打包成aar時&#xff0c;未包含 moduleB的resources資源&#xff1b; 方法一&#xff1a;將moduleB的資源&#xff0c;手動拷貝一份到moduleA中&#xff1b; 方法二&#xff1a;使用 fat-aar 插件&#xff1b; 2、fat-aar插件使…

【網絡協議】【http】http 簡單介紹

【網絡協議】【http】http 簡單介紹 1 HTTP 頭部 HTTP 是一種請求-響應協議&#xff0c;客戶端向服務器發送請求&#xff0c;服務器返回響應。 1.1 HTTP 狀態碼 狀態碼是服務器返回給客戶端的 三位數字代碼&#xff0c;用于表示請求的執行結果。 狀態碼按照首位數字分類&am…

談談空間復雜度考量,特別是遞歸調用棧空間消耗?

空間復雜度考量是算法設計的核心要素之一&#xff0c;遞歸調用棧的消耗問題在前端領域尤為突出。 以下結合真實開發場景進行深度解析&#xff1a; 一、遞歸調用棧的典型問題 1. 深層次DOM遍歷的陷阱 // 危險操作&#xff1a;遞歸遍歷未知層級的DOM樹 function countDOMNode…

LeetCode算法題(Go語言實現)_16

題目 給定一個二進制數組 nums 和一個整數 k&#xff0c;假設最多可以翻轉 k 個 0 &#xff0c;則返回執行操作后 數組中連續 1 的最大個數 。 一、代碼實現 func longestOnes(nums []int, k int) int {left, zeroCnt, maxLen : 0, 0, 0for right : 0; right < len(nums); …

【數據結構】棧 與【LeetCode】20.有效的括號詳解

目錄 一、棧1、棧的概念及結構2、棧的實現3、初始化棧和銷毀棧4、打印棧的數據5、入棧操作---棧頂6、出棧---棧頂6.1棧是否為空6.2出棧---棧頂 7、取棧頂元素8、獲取棧中有效的元素個數 二、棧的相關練習1、練習2、AC代碼 個人主頁&#xff0c;點這里~ 數據結構專欄&#xff0c…

攻破tensorflow,勇創最佳agent(2)---損失(loss) 準確率(accuracy)問題

實戰播: 怎么判定一個模型好不好,你設置的值對不對? 需要再看幾個值: 例如: model Sequential()for units in model_structure:model.add(Dense(units, activationrelu))model.add(Dropout(train_config.get(dropout_rate, 0.3)))model.add(Dense(1, activationsigmoid)) 他…

pdfh5 pdf

踩坑1&#xff1a; 渲染失敗 &#xff08;1&#xff09;在vue項目中&#xff0c;讀取本地的pdf文件需要放到public下static文件夾中&#xff0c;不能放在別的地方&#xff1b; &#xff08;2&#xff09;引用時&#xff0c;不能使用相對路徑&#xff0c;因為使用public文件下…

6.5 模擬專題:LeetCode 38. 外觀數列

1. 題目鏈接 LeetCode 38. 外觀數列 2. 題目描述 給定一個正整數 n&#xff0c;生成外觀數列的第 n 項。外觀數列的定義如下&#xff1a; 第 1 項為 "1"。第 n 項是對第 n-1 項的描述。例如&#xff0c;第 2 項描述第 1 項&#xff08;"1"&#xff09;為…

什么是具身智能

具身智能&#xff08;Embodied Intelligence&#xff09;是人工智能與機器人學交叉的前沿領域&#xff0c;強調智能體通過身體與環境的動態交互實現自主學習和進化&#xff0c;其核心在于將感知、行動與認知深度融合?。通俗地講&#xff0c;就是機器人或者智能系統在物理環境中…

git命令使用小記(打補丁)

需求&#xff1a;需要從開發分支提取本人提交代碼&#xff0c;然后合并到主分支 一、制作補丁包 mkdir -p patches for commit in $(git log commitA..commitB --author"username" --reverse --prettyformat:"%h"); do …

mapbox基礎,加載popup彈出窗

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??popup 彈出窗 api1.3.1 ??構造函數1.…

C++11--(1)

目錄 1.列表初始化 {}初始化 C98中 C11中 內置置類型和自定義類型 創建對象也適用 std::initializer_list 2.變量類型推導 auto C98 C11 decltype nullptr 3.范圍for循環 4.STL中一些變化 array 1.創建和初始化 2.訪問元素 ?編輯 3.修改操作 4.支持迭代器…

Promise的狀態和方法是什么?

Promise 的狀態和方法 1. Promise 的狀態 一個 Promise 可以處于以下三種狀態之一&#xff1a; - Pending&#xff08;待定&#xff09;&#xff1a;初始狀態&#xff0c;表示異步操作正在進行中&#xff0c;Promise 還沒有被解決或拒絕。 - Fulfilled&#xff08;已完成&…

Windows云服務器支持哪些數據庫管理系統?

Windows云服務器因其良好的兼容性和企業級支持&#xff0c;廣泛用于網站托管、企業管理系統、金融應用、數據分析等場景。在這些應用中&#xff0c;數據庫管理系統(DBMS)起著至關重要的作用。Windows 服務器支持多種數據庫&#xff0c;包括關系型數據庫(SQL)和非關系型數據庫(N…