鴻蒙崛起:探索新一代技術(shù) 課件 第8章-數(shù)據(jù)管理_第1頁
鴻蒙崛起:探索新一代技術(shù) 課件 第8章-數(shù)據(jù)管理_第2頁
鴻蒙崛起:探索新一代技術(shù) 課件 第8章-數(shù)據(jù)管理_第3頁
鴻蒙崛起:探索新一代技術(shù) 課件 第8章-數(shù)據(jù)管理_第4頁
鴻蒙崛起:探索新一代技術(shù) 課件 第8章-數(shù)據(jù)管理_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

鴻蒙崛起第8章:數(shù)據(jù)管理延遲符目錄CATALOG010203048.1ArkData介紹8.2標(biāo)準(zhǔn)化數(shù)據(jù)定義8.3應(yīng)用數(shù)據(jù)持久化8.4同應(yīng)用跨設(shè)備數(shù)據(jù)同步(分布式)058.5章末知識概覽導(dǎo)圖延遲符8.1ArkData介紹PART延遲符018.1arkdata介紹ArkData(方舟數(shù)據(jù)管理)為開發(fā)者提供數(shù)據(jù)存儲、數(shù)據(jù)管理和數(shù)據(jù)同步能力,比如聯(lián)系人應(yīng)用數(shù)據(jù)可以保存到數(shù)據(jù)庫中,提供數(shù)據(jù)庫的安全、可靠以及共享訪問等管理機(jī)制,也支持與手表同步聯(lián)系人信息。另外最重要的是,應(yīng)用創(chuàng)建的數(shù)據(jù)庫,都保存到應(yīng)用沙盒,當(dāng)應(yīng)用卸載時,數(shù)據(jù)庫也會自動刪除。這里解釋下應(yīng)用沙盒:所謂應(yīng)用沙盒,其實(shí)是一種安全機(jī)制,用于將應(yīng)用程序和系統(tǒng)隔離開來,確保應(yīng)用程序只能在受限的環(huán)境中運(yùn)行,避免應(yīng)用程序之間的相互干擾和數(shù)據(jù)泄漏的風(fēng)險。這樣程序之間的耦合性就大大降低了,并且安全性也顯著提升。8.1arkdata介紹在ArkData中,主要為HarmonyOS提供4類信息:l提供HarmonyOS跨應(yīng)用、跨設(shè)備的統(tǒng)一數(shù)據(jù)類型標(biāo)準(zhǔn),包含標(biāo)準(zhǔn)化數(shù)據(jù)類型和標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu);l提供通用數(shù)據(jù)持久化能力,根據(jù)數(shù)據(jù)特點(diǎn),分為用戶首選項(xiàng)、鍵值型數(shù)據(jù)庫和關(guān)系型數(shù)據(jù)庫;l提供高效的數(shù)據(jù)管理能力,包括權(quán)限管理、數(shù)據(jù)備份恢復(fù)、數(shù)據(jù)共享框架等。l提供跨設(shè)備數(shù)據(jù)同步能力,比如分布式對象支持內(nèi)存對象跨設(shè)備共享能力,分布式數(shù)據(jù)庫支持跨設(shè)備數(shù)據(jù)庫訪問能力。8.1arkdata介紹ArkData的數(shù)據(jù)管理架構(gòu)圖如下所示:8.1arkdata介紹在HarmonyOS中,ArkData作為核心的數(shù)據(jù)管理框架,其架構(gòu)設(shè)計旨在提供統(tǒng)一的數(shù)據(jù)存儲、管理和同步解決方案,確保數(shù)據(jù)的安全性、一致性和可訪問性。ArkData通過其架構(gòu)設(shè)計,實(shí)現(xiàn)了數(shù)據(jù)的統(tǒng)一管理,支持跨設(shè)備和跨應(yīng)用的數(shù)據(jù)交互,同時保障數(shù)據(jù)的安全性和隱私。ArkData的接口層為開發(fā)者提供了多種數(shù)據(jù)管理的API接口,包括:Preferences:用于存儲和管理應(yīng)用的用戶首選項(xiàng)。KV-Store:提供鍵值型數(shù)據(jù)管理,適用于存儲簡單的鍵值對數(shù)據(jù),支持單版本數(shù)據(jù)庫和設(shè)備協(xié)同數(shù)據(jù)庫。RelationalStore:關(guān)系型數(shù)據(jù)管理,用于存儲結(jié)構(gòu)化數(shù)據(jù),支持分類分級和數(shù)據(jù)庫加密。DataObject:分布式數(shù)據(jù)對象,支持跨設(shè)備的數(shù)據(jù)同步和對象持久化。DataShare:跨應(yīng)用數(shù)據(jù)管理,允許不同應(yīng)用間共享數(shù)據(jù),提供跨應(yīng)用訪問助手和數(shù)據(jù)共享功能。UDMF:統(tǒng)一數(shù)據(jù)管理,提供標(biāo)準(zhǔn)化的數(shù)據(jù)定義和歸一化的數(shù)據(jù)通道,實(shí)現(xiàn)跨應(yīng)用數(shù)據(jù)協(xié)同。8.1arkdata介紹系統(tǒng)服務(wù)與框架層提供了數(shù)據(jù)管理的核心服務(wù),包括:l數(shù)據(jù)存儲:提供單版本數(shù)據(jù)庫和設(shè)備協(xié)同數(shù)據(jù)庫,確保數(shù)據(jù)的持久化存儲。l數(shù)據(jù)緩存:提高數(shù)據(jù)訪問速度,減少對存儲介質(zhì)的直接訪問。l訂閱通知:允許應(yīng)用訂閱數(shù)據(jù)變化通知,實(shí)現(xiàn)數(shù)據(jù)的實(shí)時更新。l數(shù)據(jù)庫加密:確保存儲的數(shù)據(jù)安全性,防止未授權(quán)訪問。分布式同步:實(shí)現(xiàn)數(shù)據(jù)在不同設(shè)備間的同步,保持?jǐn)?shù)據(jù)的一致性。數(shù)據(jù)管理服務(wù)層是數(shù)據(jù)處理的核心,包括:

l元數(shù)據(jù)管理:管理數(shù)據(jù)的描述信息,如數(shù)據(jù)的類型、結(jié)構(gòu)等。

l端云協(xié)同:實(shí)現(xiàn)設(shè)備與云端的數(shù)據(jù)協(xié)同,支持云端數(shù)據(jù)的同步和備份。

l數(shù)據(jù)庫管理:包括鍵值型和關(guān)系型數(shù)據(jù)庫的管理,提供統(tǒng)一的數(shù)據(jù)管理接口。

l持久化對象管理:管理對象的持久化存儲,支持對象的序列化和反序列化。

l跨應(yīng)用數(shù)據(jù)庫管理:管理跨應(yīng)用的數(shù)據(jù)訪問,確保數(shù)據(jù)的安全性和隱私。8.1arkdata介紹ArkData支持多種存儲技術(shù),如xml2、sqlite3以及文件子系統(tǒng),為數(shù)據(jù)的存儲提供了靈活的選擇。這些技術(shù)可以根據(jù)不同應(yīng)用場景的需求,提供不同的存儲解決方案。ArkData的運(yùn)行依賴于多個子系統(tǒng),包括軟總線子系統(tǒng)、用戶子系統(tǒng)、安全子系統(tǒng)、包管理子系統(tǒng)和事件子系統(tǒng)。這些子系統(tǒng)共同協(xié)作,確保ArkData能夠高效、安全地管理數(shù)據(jù)。通過該設(shè)計,ArkData提供了一個強(qiáng)大而靈活的數(shù)據(jù)管理框架,使得開發(fā)者能夠輕松地實(shí)現(xiàn)數(shù)據(jù)的存儲、管理和同步,同時保障數(shù)據(jù)的安全性和隱私。隨著HarmonyOS生態(tài)系統(tǒng)的不斷發(fā)展,ArkData將發(fā)揮越來越重要的作用。延遲符8.2標(biāo)準(zhǔn)化數(shù)據(jù)定義PART延遲符028.2.1標(biāo)準(zhǔn)化數(shù)據(jù)定義概述設(shè)備、應(yīng)用交互的核心在于數(shù)據(jù)的互通,高效的數(shù)據(jù)互通基礎(chǔ)是共識。為了降低應(yīng)用/業(yè)務(wù)數(shù)據(jù)交互成本,促進(jìn)數(shù)據(jù)生態(tài)建設(shè),統(tǒng)一數(shù)據(jù)管理框架(UDMF)提供了標(biāo)準(zhǔn)化數(shù)據(jù)定義作為統(tǒng)一的HarmonyOS數(shù)據(jù)語言,用于構(gòu)建跨應(yīng)用、跨設(shè)備的統(tǒng)一數(shù)據(jù)標(biāo)準(zhǔn)與交互共識。UDMF標(biāo)準(zhǔn)化數(shù)據(jù)定義包括標(biāo)準(zhǔn)化數(shù)據(jù)類型和標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu):l標(biāo)準(zhǔn)化數(shù)據(jù)類型:主要針對同一種數(shù)據(jù)類型,提供統(tǒng)一定義,即標(biāo)準(zhǔn)數(shù)據(jù)類型描述符,定義了包括標(biāo)識數(shù)據(jù)類型的ID、類型歸屬關(guān)系等相關(guān)信息,用于解決HarmonyOS系統(tǒng)中的類型模糊問題。一般用于過濾或者識別某一種數(shù)據(jù)類型的場景,比如文件預(yù)覽、文件分享等。l標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu):主要針對部分標(biāo)準(zhǔn)化數(shù)據(jù)類型定義了統(tǒng)一的數(shù)據(jù)內(nèi)容結(jié)構(gòu),并明確了對應(yīng)的描述信息。應(yīng)用間使用標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu)進(jìn)行數(shù)據(jù)交互后,將遵從統(tǒng)一的解析標(biāo)準(zhǔn),可有效減少適配相關(guān)的工作量。一般用于跨應(yīng)用跨設(shè)備間的數(shù)據(jù)交互,比如拖拽。8.2.2標(biāo)準(zhǔn)化數(shù)據(jù)類型

標(biāo)準(zhǔn)化數(shù)據(jù)類型(UniformTypeDescriptor,簡稱UTD)用于解決系統(tǒng)中的類型模糊問題,即針對同一種數(shù)據(jù)類型,存在不同的類型描述方式:MIMEType、文件擴(kuò)展名等。例如描述jpg/jpeg類型圖片時,可以使用image/jpeg、.jpg、.jpeg或image/picture等方式進(jìn)行描述。當(dāng)相關(guān)類型的數(shù)據(jù)進(jìn)行跨應(yīng)用、跨設(shè)備傳輸時,目標(biāo)端應(yīng)用/設(shè)備需要進(jìn)行多方面的適配,才能夠?qū)?shù)據(jù)內(nèi)容進(jìn)行相關(guān)處理,且存在無法識別的情況。標(biāo)準(zhǔn)化數(shù)據(jù)類型分為預(yù)置數(shù)據(jù)類型和應(yīng)用自定義數(shù)據(jù)類型。并且支持從其他類型體系轉(zhuǎn)換為UTD標(biāo)準(zhǔn)類型,如文件名后綴和MIMEtype。標(biāo)準(zhǔn)化數(shù)據(jù)類型一定要按照層級結(jié)構(gòu)來構(gòu)建。比如基于MIMEType或文件后綴名進(jìn)行類型區(qū)分就存在扁平化的數(shù)據(jù)類型定義的不足。這種定義難以描述不同類型間的兼容與繼承關(guān)系,且在實(shí)際使用過程中,會增加應(yīng)用處理數(shù)據(jù)類型時的開發(fā)復(fù)雜度。例如搜索場景,用戶從精確地搜索動物相關(guān)的任意類型圖片,進(jìn)一步擴(kuò)展到動物相關(guān)的任意圖片、視頻或音頻資源。為了滿足上述場景,我們需要在定義數(shù)據(jù)類型時,支持類型層級結(jié)構(gòu)。8.2.2標(biāo)準(zhǔn)化數(shù)據(jù)類型構(gòu)建標(biāo)準(zhǔn)類型的層級結(jié)構(gòu),定義層級結(jié)構(gòu)中的類型歸屬關(guān)系,能夠幫助系統(tǒng)、應(yīng)用實(shí)現(xiàn)數(shù)據(jù)類型的分層、分類管理。當(dāng)用戶進(jìn)行數(shù)據(jù)分享或拖拽時,如果數(shù)據(jù)中同時包含圖片、視頻、音頻等內(nèi)容,系統(tǒng)/應(yīng)用可以根據(jù)層級按需對分享內(nèi)容進(jìn)行整理,如分享了幾張照片、幾條視頻或幾個媒體資源文件等。UTD中定義的標(biāo)準(zhǔn)化數(shù)據(jù)類型在設(shè)計原則上按物理和邏輯分為兩類:1.按物理分類的根節(jié)點(diǎn)為general.entity,用于描述類型的物理屬性,比如文件、目錄等。如圖8-2所示。2.按邏輯(功能)分類的根節(jié)點(diǎn)為general.object,用于描述類型的功能性特征,如圖片、網(wǎng)頁等。如圖8-3所示。圖8-2圖8-38.2.2標(biāo)準(zhǔn)化數(shù)據(jù)類型標(biāo)準(zhǔn)化數(shù)據(jù)類型包含了標(biāo)準(zhǔn)化數(shù)據(jù)類型的標(biāo)識ID、歸屬類型關(guān)系、簡要描述等信息,每個類型定義具體包含以下內(nèi)容:typeId:定義標(biāo)準(zhǔn)化數(shù)據(jù)類型的ID,該ID具有唯一性。belongingToTypes:定義標(biāo)準(zhǔn)化數(shù)據(jù)類型的歸屬關(guān)系,即該標(biāo)準(zhǔn)化數(shù)據(jù)類型歸屬于哪個更高層級的類型,允許存在一個標(biāo)準(zhǔn)化數(shù)據(jù)類型歸屬于多個類型的情況。description:標(biāo)準(zhǔn)化數(shù)據(jù)類型的簡要說明。referenceURL:標(biāo)準(zhǔn)化數(shù)據(jù)類型的參考鏈接URL,用于描述類型的詳細(xì)信息。iconFile:標(biāo)準(zhǔn)化數(shù)據(jù)類型的默認(rèn)圖標(biāo)文件路徑,可能為空字符串(即沒有默認(rèn)圖標(biāo)),應(yīng)用可以自行決定是否使用該默認(rèn)圖標(biāo)。filenameExtensions:標(biāo)準(zhǔn)化數(shù)據(jù)類型所關(guān)聯(lián)的文件名后綴列表。mimeTypes:標(biāo)準(zhǔn)化數(shù)據(jù)類型所關(guān)聯(lián)的多用途互聯(lián)網(wǎng)郵件擴(kuò)展類型列表。8.2.2標(biāo)準(zhǔn)化數(shù)據(jù)類型下面以新增媒體類文件類型場景為例,說明如何自定義UTD標(biāo)準(zhǔn)化數(shù)據(jù)類型:l

當(dāng)前應(yīng)用在entry\src\main\resources\rawfile\arkdata\utd\目錄下新增utd.json5文件。l

在當(dāng)前應(yīng)用的utd.json5配置文件內(nèi)新增所需的自定義數(shù)據(jù)類型,具體定義見附錄46。l

使用自定義數(shù)據(jù)類型,需在其應(yīng)用entry\src\main\resources\rawfile\arkdata\utd\目錄下新增utd.json5文件。然后在utd.json5配置文件中進(jìn)行聲明,見附錄47。l

其他應(yīng)用也可以在DevEcoStudio中創(chuàng)建utd.json5模板,在模板中引用當(dāng)前應(yīng)用內(nèi)的自定義數(shù)據(jù)類型之后,基于已引用的自定義數(shù)據(jù)類型進(jìn)行自定義。同時,DevEcoStudio還會對配置文件中的字段進(jìn)行格式校驗(yàn),utd.json5配置文件,見附錄48。8.2.2標(biāo)準(zhǔn)化數(shù)據(jù)類型{"UniformDataTypeDeclarations":[{"TypeId":"com.example.myFirstHap.image","BelongingToTypes":["general.image"],"FilenameExtensions":[".myImage",".khImage"],"MIMETypes":["application/myImage","application/khImage"],"Description":"MyImage.","ReferenceURL":""},{"TypeId":"com.example.myFirstHap.audio","BelongingToTypes":["general.audio"],"FilenameExtensions":[".myAudio",".khAudio"],"MIMETypes":["application/myAudio","application/khAudio"],"Description":"Myaudio.","ReferenceURL":""},{"TypeId":"com.example.myFirstHap.video","BelongingToTypes":["general.video"],"FilenameExtensions":[".myVideo",".khVideo"],"MIMETypes":["application/myVideo","application/khVideo"],"Description":"Myvideo.","ReferenceURL":""}]}{"ReferenceUniformDataTypeDeclarations":[{"TypeId":"com.example.myFirstHap.image","BelongingToTypes":["general.image"],"FilenameExtensions":[".myImage",".khImage"],"MIMETypes":["application/myImage","application/khImage"],"Description":"MyImage.","ReferenceURL":""}]}{"UniformDataTypeDeclarations":[{"TypeId":"com.example.mySecondHap.image","BelongingToTypes":["com.example.myFirstHap.image"],"FilenameExtensions":[".myImageEx",".khImageEx"],"MIMETypes":["application/my-ImageEx","application/khImageEx"],"Description":"MyImageextension.","ReferenceURL":""}]}附錄46附錄47附錄488.2.3標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu)

針對UTD標(biāo)準(zhǔn)化數(shù)據(jù)類型中的部分常見類型,為了方便業(yè)務(wù)使用,其按照不同的數(shù)據(jù)類型提供了標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu),例如系統(tǒng)定義的桌面圖標(biāo)類型(對應(yīng)的標(biāo)準(zhǔn)化數(shù)據(jù)類型標(biāo)識為'openharmony.app-item'),這里明確定義了該數(shù)據(jù)結(jié)構(gòu)對應(yīng)的相關(guān)描述信息。

某些業(yè)務(wù)場景下應(yīng)用可以直接使用我們具體定義的UTD標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu),例如跨應(yīng)用拖拽場景。拖出方應(yīng)用可以按照標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu)將拖拽數(shù)據(jù)寫入拖拽事件,拖入方應(yīng)用從拖拽事件中讀取拖拽數(shù)據(jù)并按照標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu)進(jìn)行數(shù)據(jù)的解析。這使得不同應(yīng)用間的數(shù)據(jù)交互遵從相同的標(biāo)準(zhǔn)定義,有效減少了跨應(yīng)用數(shù)據(jù)交互的開發(fā)工作量。

以使用標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu)定義數(shù)據(jù)內(nèi)容(包含超鏈接、純文本兩條數(shù)據(jù)記錄)為例,提供基本的開發(fā)步驟,見附錄49。

以上代碼的主要目的是展示如何在HarmonyOS應(yīng)用中使用ArkData模塊來創(chuàng)建、管理和操作不同類型的數(shù)據(jù)記錄。通過這種方式,開發(fā)者可以方便地在應(yīng)用中實(shí)現(xiàn)數(shù)據(jù)的統(tǒng)一管理和操作。8.2.3標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu)//1.導(dǎo)入unifiedDataChannel和uniformTypeDescriptor模塊。import{uniformDataStruct,uniformTypeDescriptor,unifiedDataChannel}from'@kit.ArkData';//2.創(chuàng)建超鏈接數(shù)據(jù)記錄。lethyperlinkDetails:Record<string,string>={'attr1':'value1','attr2':'value2',}lethyperlink:uniformDataStruct.Hyperlink={uniformDataType:'general.hyperlink',url:'www.XXX.com',description:'Thisisthedescriptionofthishyperlink',details:hyperlinkDetails,}hyperlink.description='...';//修改hyperlink屬性description(`hyperlinkurl=${hyperlink.url}`);//訪問對象屬性。//3.創(chuàng)建純文本數(shù)據(jù)類型記錄,將其添加到剛才創(chuàng)建的UnifiedData對象。letplainTextDetails:Record<string,string>={'attr1':'value1','attr2':'value2',}letplainText:uniformDataStruct.PlainText={uniformDataType:'general.plain-text',textContent:'ThisisplainTexttextContentexample',abstract:'thisisabstract',details:plainTextDetails,}//4.創(chuàng)建一個統(tǒng)一數(shù)據(jù)對象實(shí)例。letunifiedData=newunifiedDataChannel.UnifiedData();lethyperlinkRecord=newunifiedDataChannel.UnifiedRecord(uniformTypeDescriptor.UniformDataType.HYPERLINK,hyperlink);letplainTextRecord=newunifiedDataChannel.UnifiedRecord(uniformTypeDescriptor.UniformDataType.PLAIN_TEXT,plainText);//5.添加plainText數(shù)據(jù)記錄。unifiedData.addRecord(hyperlinkRecord);unifiedData.addRecord(plainTextRecord);//6.記錄添加完成后,可獲取當(dāng)前UnifiedData對象內(nèi)的所有數(shù)據(jù)記錄。letrecords=unifiedData.getRecords();附錄498.2.3標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu)//7.遍歷每條記錄,判斷該記錄的數(shù)據(jù)類型,轉(zhuǎn)換為子類對象,得到原數(shù)據(jù)記錄。for(leti=0;i<records.length;i++){

letunifiedDataRecord=records[i]asunifiedDataChannel.UnifiedRecord;

letrecord=unifiedDataRecord.getValue()asobject;

if(record!=undefined){

//讀取該數(shù)據(jù)記錄的類型

lettype:string=record["uniformDataType"];

switch(type){

caseuniformTypeDescriptor.UniformDataType.HYPERLINK:

Object.keys(record).forEach(key=>{

('showrecords:'+key+',value:'+record[key]);

});

break;

caseuniformTypeDescriptor.UniformDataType.PLAIN_TEXT:

Object.keys(record).forEach(key=>{

('showrecords:'+key+',value:'+record[key]);

});

break;

default:

break;

}

}}附錄49延遲符8.3應(yīng)用數(shù)據(jù)持久化PART延遲符038.3應(yīng)用數(shù)據(jù)持久化應(yīng)用數(shù)據(jù)持久化,是指應(yīng)用將內(nèi)存中的數(shù)據(jù)通過文件或數(shù)據(jù)庫的形式保存到設(shè)備上。內(nèi)存中的數(shù)據(jù)形態(tài)通常是任意的數(shù)據(jù)結(jié)構(gòu)或數(shù)據(jù)對象,存儲介質(zhì)上的數(shù)據(jù)形態(tài)可能是文本、數(shù)據(jù)庫、二進(jìn)制文件等。HarmonyOS標(biāo)準(zhǔn)系統(tǒng)支持典型的存儲數(shù)據(jù)形態(tài),包括用戶首選項(xiàng)、鍵值型數(shù)據(jù)庫、關(guān)系型數(shù)據(jù)庫。開發(fā)者可以根據(jù)如下功能介紹,選擇合適的數(shù)據(jù)形態(tài)以滿足自己應(yīng)用數(shù)據(jù)的持久化需:l用戶首選項(xiàng)(Preferences):通常用于保存應(yīng)用的配置信息。數(shù)據(jù)通過文本的形式保存在設(shè)備中,應(yīng)用使用過程中會將文本中的數(shù)據(jù)全量加載到內(nèi)存中,所以訪問速度快、效率高,但不適合需要存儲大量數(shù)據(jù)的場景。l鍵值型數(shù)據(jù)庫(KV-Store):一種非關(guān)系型數(shù)據(jù)庫,其數(shù)據(jù)以“鍵值”對的形式進(jìn)行組織、索引和存儲,其中“鍵”作為唯一標(biāo)識符。適合很少數(shù)據(jù)關(guān)系和業(yè)務(wù)關(guān)系的業(yè)務(wù)數(shù)據(jù)存儲,同時因其在分布式場景中降低了解決數(shù)據(jù)庫版本兼容問題的復(fù)雜度,和數(shù)據(jù)同步過程中沖突解決的復(fù)雜度而被廣泛使用。相比于關(guān)系型數(shù)據(jù)庫,更容易做到跨設(shè)備跨版本兼容。l關(guān)系型數(shù)據(jù)庫(RelationalStore):一種關(guān)系型數(shù)據(jù)庫,以行和列的形式存儲數(shù)據(jù),廣泛用于應(yīng)用中的關(guān)系型數(shù)據(jù)的處理,包括一系列的增、刪、改、查等接口,開發(fā)者也可以運(yùn)行自己定義的SQL語句來滿足復(fù)雜業(yè)務(wù)場景的需要。8.3.1用戶首選項(xiàng)實(shí)現(xiàn)數(shù)據(jù)持久化用戶首選項(xiàng)為應(yīng)用提供Key-Value鍵值型的數(shù)據(jù)處理能力,支持應(yīng)用持久化輕量級數(shù)據(jù),并對其修改和查詢。當(dāng)用戶希望有一個全局唯一存儲的地方,可以采用用戶首選項(xiàng)來進(jìn)行存儲。Preferences會將該數(shù)據(jù)緩存在內(nèi)存中,當(dāng)用戶讀取的時候,能夠快速從內(nèi)存中獲取數(shù)據(jù),當(dāng)需要持久化時可以使用flush接口將內(nèi)存中的數(shù)據(jù)寫入持久化文件中。Preferences會隨著存放的數(shù)據(jù)量越多而導(dǎo)致應(yīng)用占用的內(nèi)存越大,因此,Preferences不適合存放過多的數(shù)據(jù),也不支持通過配置加密,適用的場景一般為應(yīng)用保存用戶的個性化設(shè)置(字體大小,是否開啟夜間模式)等,下圖為用戶首選項(xiàng)的運(yùn)行機(jī)制。8.3.1用戶首選項(xiàng)實(shí)現(xiàn)數(shù)據(jù)持久化下面以一個示例展示用戶首選項(xiàng)的數(shù)據(jù)持久化管理,見附錄50。1.導(dǎo)入@kit.ArkData模塊:import{preferences}from'@kit.ArkData';2.獲取Preferences實(shí)例:import{UIAbility}from'@kit.AbilityKit';import{BusinessError}from'@kit.BasicServicesKit';import{window}from'@kit.ArkUI';letdataPreferences:preferences.Preferences|null=null;

classEntryAbilityextendsUIAbility{

onWindowStageCreate(windowStage:window.WindowStage){

letoptions:preferences.Options={name:'myStore'};

dataPreferences=preferences.getPreferencesSync(this.context,options);

}}3.寫入數(shù)據(jù):使用putSync()方法保存數(shù)據(jù)到緩存的Preferences實(shí)例中。在寫入數(shù)據(jù)后,如有需要,可使用flush()方法將Preferences實(shí)例的數(shù)據(jù)存儲到持久化文件:import{util}from'@kit.ArkTS';if(dataPreferences.hasSync('startup')){

("Thekey'startup'iscontained.");}else{

("Thekey'startup'doesnotcontain.");

//此處以此鍵值對不存在時寫入數(shù)據(jù)為例

dataPreferences.putSync('startup','auto');

//當(dāng)字符串有特殊字符時,需要將字符串轉(zhuǎn)為Uint8Array類型再存儲

letuInt8Array1=newutil.TextEncoder().encodeInto("~!@#¥%……&*()——+?");

dataPreferences.putSync('uInt8',uInt8Array1);}附錄508.3.1用戶首選項(xiàng)實(shí)現(xiàn)數(shù)據(jù)持久化4.讀取數(shù)據(jù),使用getSync()方法獲取數(shù)據(jù),即指定鍵對應(yīng)的值。如果值為null或者非默認(rèn)值類型,則返回默認(rèn)數(shù)據(jù):letval=dataPreferences.getSync('startup','default');("The'startup'valueis"+val);//當(dāng)獲取的值為帶有特殊字符的字符串時,需要將獲取到的Uint8Array轉(zhuǎn)換為字符串letuInt8Array2:preferences.ValueType=dataPreferences.getSync('uInt8',newUint8Array(0));lettextDecoder=util.TextDecoder.create('utf-8');val=textDecoder.decodeToString(uInt8Array2asUint8Array);("The'uInt8'valueis"+val);刪除數(shù)據(jù),使用deleteSync()方法刪除指定鍵值對:dataPreferences.deleteSync('startup');5.數(shù)據(jù)持久化,應(yīng)用存入數(shù)據(jù)到Preferences實(shí)例后,可以使用flush()方法實(shí)現(xiàn)數(shù)據(jù)持久化:dataPreferences.flush((err:BusinessError)=>{if(err){console.error(`Failedtoflush.Code:${err.code},message:${err.message}`);return;}('Succeededinflushing.');})附錄508.3.1用戶首選項(xiàng)實(shí)現(xiàn)數(shù)據(jù)持久化6.訂閱數(shù)據(jù)變更,應(yīng)用訂閱數(shù)據(jù)變更需要指定observer作為回調(diào)方法。訂閱的Key值發(fā)生變更后,當(dāng)執(zhí)行flush()方法時,observer被觸發(fā)回調(diào):letobserver=(key:string)=>{

('Thekey'+key+'changed.');}dataPreferences.on('change',observer);//數(shù)據(jù)產(chǎn)生變更,由'auto'變?yōu)?manual'dataPreferences.put('startup','manual',(err:BusinessError)=>{

if(err){

console.error(`Failedtoputthevalueof'startup'.Code:${err.code},message:${err.message}`);

return;

}

("Succeededinputtingthevalueof'startup'.");

if(dataPreferences!==null){

dataPreferences.flush((err:BusinessError)=>{

if(err){

console.error(`Failedtoflush.Code:${err.code},message:${err.message}`);

return;

}

('Succeededinflushing.');

})

}})7.刪除指定文件,使用deletePreferences()方法從內(nèi)存中移除指定文件對應(yīng)的Preferences實(shí)例,包括內(nèi)存中的數(shù)據(jù)。若該P(yáng)reference存在對應(yīng)的持久化文件,則同時刪除該持久化文件,包括指定文件及其備份文件、損壞文件:preferences.deletePreferences(this.context,options,(err:BusinessError)=>{

if(err){

console.error(`Failedtodeletepreferences.Code:${err.code},message:${err.message}`);

return;

}

('Succeededindeletingpreferences.');})附錄508.3.2鍵值型數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)持久化鍵值型數(shù)據(jù)庫存儲鍵值對形式的數(shù)據(jù),當(dāng)需要存儲的數(shù)據(jù)沒有復(fù)雜的關(guān)系模型,比如存儲商品名稱及對應(yīng)價格、員工工號及今日是否已出勤等,由于數(shù)據(jù)復(fù)雜度低,更容易兼容不同數(shù)據(jù)庫版本和設(shè)備類型,因此推薦使用鍵值型數(shù)據(jù)庫持久化此類數(shù)據(jù)。若要使用鍵值型數(shù)據(jù)庫,要遵循有以下步驟,見附錄51。1.要獲取一個KVManager實(shí)例,用于管理數(shù)據(jù)庫對象://導(dǎo)入模塊import{distributedKVStore}from'@kit.ArkData';//Stage模型import{window}from'@kit.ArkUI';import{UIAbility}from'@kit.AbilityKit';import{BusinessError}from'@kit.BasicServicesKit';letkvManager:distributedKVStore.KVManager|undefined=undefined;exportdefaultclassEntryAbilityextendsUIAbility{

onCreate(){

letcontext=this.context;

constkvManagerConfig:distributedKVStore.KVManagerConfig={

context:context,

bundleName:'com.example.datamanagertest'

};

try{

//創(chuàng)建KVManager實(shí)例

kvManager=distributedKVStore.createKVManager(kvManagerConfig);

('SucceededincreatingKVManager.');

//繼續(xù)創(chuàng)建獲取數(shù)據(jù)庫

}catch(e){

leterror=easBusinessError;

console.error(`FailedtocreateKVManager.Code:${error.code},message:${error.message}`);

}

}}if(kvManager!==undefined){

kvManager=kvManagerasdistributedKVStore.KVManager;

//進(jìn)行后續(xù)操作

//...}2.創(chuàng)建并獲取鍵值數(shù)據(jù)庫:letkvStore:distributedKVStore.SingleKVStore|undefined=undefined;try{

constoptions:distributedKVStore.Options={

createIfMissing:true,

encrypt:false,

backup:false,

autoSync:false,

//kvStoreType不填時,默認(rèn)創(chuàng)建多設(shè)備協(xié)同數(shù)據(jù)庫

kvStoreType:distributedKVStore.KVStoreType.SINGLE_VERSION,

//多設(shè)備協(xié)同數(shù)據(jù)庫:kvStoreType:distributedKVStore.KVStoreType.DEVICE_COLLABORATION,

securityLevel:distributedKVStore.SecurityLevel.S1

};

kvManager.getKVStore<distributedKVStore.SingleKVStore>('storeId',options,(err,store:distributedKVStore.SingleKVStore)=>{

if(err){

console.error(`FailedtogetKVStore:Code:${err.code},message:${err.message}`);

return;

}

('SucceededingettingKVStore.');

kvStore=store;

//請確保獲取到鍵值數(shù)據(jù)庫實(shí)例后,再進(jìn)行相關(guān)數(shù)據(jù)操作

});}catch(e){

leterror=easBusinessError;

console.error(`Anunexpectederroroccurred.Code:${error.code},message:${error.message}`);}if(kvStore!==undefined){

kvStore=kvStoreasdistributedKVStore.SingleKVStore;

//進(jìn)行后續(xù)操作

//...}附錄513.put()方法向鍵值數(shù)據(jù)庫中插入數(shù)據(jù):constKEY_TEST_STRING_ELEMENT='key_test_string';constVALUE_TEST_STRING_ELEMENT='value_test_string';try{

kvStore.put(KEY_TEST_STRING_ELEMENT,VALUE_TEST_STRING_ELEMENT,(err)=>{

if(err!==undefined){

console.error(`Failedtoputdata.Code:${err.code},message:${err.message}`);

return;

}

('Succeededinputtingdata.');

});}catch(e){

leterror=easBusinessError;

console.error(`Anunexpectederroroccurred.Code:${error.code},message:${error.message}`);}附錄514.get()方法獲取指定鍵的值:try{

kvStore.put(KEY_TEST_STRING_ELEMENT,VALUE_TEST_STRING_ELEMENT,(err)=>{

if(err!==undefined){

console.error(`Failedtoputdata.Code:${err.code},message:${err.message}`);

return;

}

('Succeededinputtingdata.');

kvStore=kvStoreasdistributedKVStore.SingleKVStore;

kvStore.get(KEY_TEST_STRING_ELEMENT,(err,data)=>{

if(err!=undefined){

console.error(`Failedtogetdata.Code:${err.code},message:${err.message}`);

return;

}

(`Succeededingettingdata.Data:${data}`);

});

});}catch(e){

leterror=easBusinessError;

console.error(`Failedtogetdata.Code:${error.code},message:${error.message}`);}附錄515.delete()方法刪除指定鍵值的數(shù)據(jù):try{

kvStore.put(KEY_TEST_STRING_ELEMENT,VALUE_TEST_STRING_ELEMENT,(err)=>{

if(err!==undefined){

console.error(`Failedtoputdata.Code:${err.code},message:${err.message}`);

return;

}

('Succeededinputtingdata.');

kvStore=kvStoreasdistributedKVStore.SingleKVStore;

kvStore.delete(KEY_TEST_STRING_ELEMENT,(err)=>{

if(err!==undefined){

console.error(`Failedtodeletedata.Code:${err.code},message:${err.message}`);

return;

}

('Succeededindeletingdata.');

});

});}catch(e){

leterror=easBusinessError;

console.error(`Anunexpectederroroccurred.Code:${error.code},message:${error.message}`);}附錄518.3.3關(guān)系型數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)持久化此處添加詳細(xì)文本描述,建議與標(biāo)題相關(guān)并符合整體語言風(fēng)格,語言描述盡量簡潔生動此處添加詳細(xì)文本描述,建議與標(biāo)題相關(guān)并符合整體語言風(fēng)格,語言描述盡量簡潔生動此處添加詳細(xì)文本描述,建議與標(biāo)題相關(guān)并符合整體語言風(fēng)格,語言描述盡量簡潔生動關(guān)系型數(shù)據(jù)庫基于SQLite組件,適用于存儲包含復(fù)雜關(guān)系數(shù)據(jù)的場景,比如一個班級的學(xué)生信息,需要包括姓名、學(xué)號、各科成績等,又或者公司的雇員信息,需要包括姓名、工號、職位等,由于數(shù)據(jù)之間有較強(qiáng)的對應(yīng)關(guān)系,復(fù)雜程度比鍵值型數(shù)據(jù)更高,此時需要使用關(guān)系型數(shù)據(jù)庫來持久化保存數(shù)據(jù)。

大數(shù)據(jù)量場景下查詢數(shù)據(jù)可能會導(dǎo)致耗時長甚至應(yīng)用卡死,這里有如下建議:l

單次查詢數(shù)據(jù)量不超過5000條。l

在TaskPool中查詢。l

拼接SQL語句盡量簡潔。l

合理地分批次查詢。關(guān)系型數(shù)據(jù)庫對應(yīng)用提供通用的操作接口,底層使用SQLite作為持久化存儲引擎,支持SQLite具有的數(shù)據(jù)庫特性,包括但不限于事務(wù)、索引、視圖、觸發(fā)器、外鍵、參數(shù)化查詢和預(yù)編譯SQL語句。其運(yùn)行原理如圖所示。這里以Stage模型為例展示關(guān)系型數(shù)據(jù)庫持久化的開發(fā)步驟,見附錄52(未附見教材)。延遲符8.4同應(yīng)用跨設(shè)備數(shù)據(jù)同步(分布式)PART延遲符04延遲符跨設(shè)備數(shù)據(jù)同步功能(即分布式功能),指將數(shù)據(jù)同步到一個組網(wǎng)環(huán)境中的其他設(shè)備。常用于用戶應(yīng)用程序數(shù)據(jù)內(nèi)容在可信認(rèn)證的不同設(shè)備間,進(jìn)行自由同步、修改和查詢。例如:當(dāng)設(shè)備1上的應(yīng)用A在分布式數(shù)據(jù)庫中增、刪、改數(shù)據(jù)后,設(shè)備2上的應(yīng)用A也可以獲取到該數(shù)據(jù)庫變化。可在分布式圖庫、備忘錄、聯(lián)系人、文件管理器等場景中使用。根據(jù)跨設(shè)備同步數(shù)據(jù)生命周期的不同,可以分為臨時數(shù)據(jù)和持久數(shù)據(jù),其中臨時數(shù)據(jù)生命周期較短,通常保存到內(nèi)存中。比如游戲應(yīng)用產(chǎn)生的過程數(shù)據(jù),建議使用分布式數(shù)據(jù)對象;持久數(shù)據(jù)生命周期較長,需要保存到存儲的數(shù)據(jù)庫中,根據(jù)數(shù)據(jù)關(guān)系和特點(diǎn),可以選擇關(guān)系型數(shù)據(jù)庫或者鍵值型數(shù)據(jù)庫。比如圖庫應(yīng)用的各種相冊、封面、圖片等屬性信息,建議使用關(guān)系型數(shù)據(jù)庫,圖庫應(yīng)用的具體圖片縮略圖,建議使用鍵值型數(shù)據(jù)庫。8.4同應(yīng)用跨設(shè)備數(shù)據(jù)同步(分布式)在分布式場景中,會涉及多個設(shè)備,組網(wǎng)內(nèi)設(shè)備之間看到的數(shù)據(jù)是否一致稱為分布式數(shù)據(jù)庫的一致性。分布式數(shù)據(jù)庫一致性可以分為強(qiáng)一致性、弱一致性和最終一致性:l強(qiáng)一致性:是指某一設(shè)備成功增、刪、改數(shù)據(jù)后,組網(wǎng)內(nèi)任意設(shè)備可立即讀取數(shù)據(jù)獲得更新后的值。l弱一致性:是指某一設(shè)備成功增、刪、改數(shù)據(jù)后,組網(wǎng)內(nèi)設(shè)備可能讀取到本次更新后的數(shù)據(jù),也可能讀取不到,不能保證在多長時間后每個設(shè)備的數(shù)據(jù)一定是一致的。l最終一致性:是指某一設(shè)備成功增、刪、改數(shù)據(jù)后,組網(wǎng)內(nèi)設(shè)備可能讀取不到本次更新后的數(shù)據(jù),但在某個時間窗口之后組網(wǎng)內(nèi)設(shè)備的數(shù)據(jù)能夠達(dá)到一致狀態(tài)。強(qiáng)一致性對分布式數(shù)據(jù)的管理要求非常高,在服務(wù)器的分布式場景可能會遇到。因?yàn)橐苿咏K端設(shè)備的不常在線、以及無中心的特性,所以同應(yīng)用跨設(shè)備數(shù)據(jù)同步不支持強(qiáng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論