【HarmonyOS】應(yīng)用開發(fā)第七章-數(shù)據(jù)持久化_第1頁
【HarmonyOS】應(yīng)用開發(fā)第七章-數(shù)據(jù)持久化_第2頁
【HarmonyOS】應(yīng)用開發(fā)第七章-數(shù)據(jù)持久化_第3頁
【HarmonyOS】應(yīng)用開發(fā)第七章-數(shù)據(jù)持久化_第4頁
【HarmonyOS】應(yīng)用開發(fā)第七章-數(shù)據(jù)持久化_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第七章HarmonyOS數(shù)據(jù)持久化武漢大學(xué)計(jì)算機(jī)學(xué)院

趙小剛大綱創(chuàng)建Data

Ability文件存儲(chǔ)關(guān)系型數(shù)據(jù)庫對(duì)象關(guān)系映射數(shù)據(jù)庫輕量級(jí)偏好數(shù)據(jù)庫分布式數(shù)據(jù)服務(wù)分布式文件服務(wù)DataAbility使用Data模板的Ability(以下簡(jiǎn)稱“Data”)有助于應(yīng)用管理其自身和其他應(yīng)用存儲(chǔ)數(shù)據(jù)的訪問,并提供與其他應(yīng)用共享數(shù)據(jù)的方法。Data既可用于同設(shè)備不同應(yīng)用的數(shù)據(jù)共享,也支持跨設(shè)備不同應(yīng)用的數(shù)據(jù)共享。數(shù)據(jù)的存放形式多樣,可以是數(shù)據(jù)庫,也可以是磁盤上的文件。Data對(duì)外提供對(duì)數(shù)據(jù)的增、刪、改、查,以及打開文件等接口,這些接口的具體實(shí)現(xiàn)由開發(fā)者提供。確定數(shù)據(jù)存儲(chǔ)方式確定數(shù)據(jù)的存儲(chǔ)方式,Data支持以下兩種數(shù)據(jù)形式:文件數(shù)據(jù):如文本、圖片、音樂等。結(jié)構(gòu)化數(shù)據(jù):如數(shù)據(jù)庫等。創(chuàng)建Data使用Data模板的Ability形式仍然是Ability,因此,開發(fā)者需要為應(yīng)用添加一個(gè)或多個(gè)Ability的子類,來提供程序與其他應(yīng)用之間的接口。Data為結(jié)構(gòu)化數(shù)據(jù)和文件提供了不同API接口供用戶使用,因此,開發(fā)者需要首先確定好使用何種類型的數(shù)據(jù)。本章節(jié)主要講述了創(chuàng)建Data的基本步驟和需要使用的接口。Data提供方可以自定義數(shù)據(jù)的增、刪、改、查,以及文件打開等功能,并對(duì)外提供這些接口。實(shí)現(xiàn)UserDataAbilityUserDataAbility用于接收其他應(yīng)用發(fā)送的請(qǐng)求,提供外部程序訪問的入口,從而實(shí)現(xiàn)應(yīng)用間的數(shù)據(jù)訪問。實(shí)現(xiàn)UserDataAbility,需要在“Project”窗口當(dāng)前工程的主目錄(“entry>src>main>java>com.xxx.xxx”)選擇“File>New>Ability>EmptyDataAbility”,設(shè)置“DataName”后完成UserDataAbility的創(chuàng)建。Data提供了文件存儲(chǔ)和數(shù)據(jù)庫存儲(chǔ)兩組接口供用戶使用。注冊(cè)UserDataAbility和ServiceAbility類似,開發(fā)者必須在配置配置文件中注冊(cè)DataAbility。配置文件中該字段在創(chuàng)建DataAbility時(shí)會(huì)自動(dòng)創(chuàng)建,name與創(chuàng)建的DataAbility一致。需要關(guān)注以下屬性:type:類型設(shè)置為datauri:對(duì)外提供的訪問路徑,全局唯一permissions:訪問該dataability時(shí)需要申請(qǐng)的訪問權(quán)限{"name":".UserDataAbility","type":"data","visible":true,"uri":"dataability://com.example.myapplication5.DataAbilityTest","permissions":["com.example.myapplication5.DataAbility.DATA"]}URI介紹Data的提供方和使用方都通過URI(UniformResourceIdentifier)來標(biāo)識(shí)一個(gè)具體的數(shù)據(jù),例如數(shù)據(jù)庫中的某個(gè)表或磁盤上的某個(gè)文件。HarmonyOS的URI仍基于URI通用標(biāo)準(zhǔn),格式如下:跨設(shè)備場(chǎng)景:dataability://device_id/com.huawei.dataability.persondata/person/10本地設(shè)備:dataability:///com.huawei.dataability.persondata/person/10scheme:協(xié)議方案名,固定為“dataability”,代表DataAbility所使用的協(xié)議類型。authority:設(shè)備ID。如果為跨設(shè)備場(chǎng)景,則為目標(biāo)設(shè)備的ID;如果為本地設(shè)備場(chǎng)景,則不需要填寫。path:資源的路徑信息,代表特定資源的位置信息。query:查詢參數(shù)。fragment:可以用于指示要訪問的子資源。文件存儲(chǔ)開發(fā)者需要在Data中重寫FileDescriptoropenFile?(Uriuri,Stringmode)方法來操作文件:uri為客戶端傳入的請(qǐng)求目標(biāo)路徑;mode為開發(fā)者對(duì)文件的操作選項(xiàng),可選方式包含“r”(讀),“w”(寫),“rw”(讀寫)等。ohos.rpc.MessageParcel類提供了一個(gè)靜態(tài)方法,用于獲取MessageParcel實(shí)例。開發(fā)者可通過獲取到的MessageParcel實(shí)例,使用dupFileDescriptor()函數(shù)復(fù)制待操作文件流的文件描述符,并將其返回,供遠(yuǎn)端應(yīng)用訪問文件。根據(jù)傳入的uri打開對(duì)應(yīng)的文件@OverridepublicFileDescriptoropenFile(Uriuri,Stringmode)throwsFileNotFoundException{//創(chuàng)建messageParcelMessageParcelmessageParcel=MessageParcel.obtain();Filefile=newFile(uri.getDecodedPathList().get(1));if(mode==null||!"rw".equals(mode)){file.setReadOnly();}FileInputStreamfileIs=newFileInputStream(file);FileDescriptorfd=fileIs.getFD();

//綁定文件描述符returnmessageParcel.dupFileDescriptor(fd);}訪問Data開發(fā)者可以通過DataAbilityHelper類來訪問當(dāng)前應(yīng)用或其他應(yīng)用提供的共享數(shù)據(jù)。DataAbilityHelper作為客戶端,與提供方的Data進(jìn)行通信。Data接收到請(qǐng)求后,執(zhí)行相應(yīng)的處理,并返回結(jié)果。DataAbilityHelper提供了一系列與DataAbility對(duì)應(yīng)的方法。使用步驟如下:聲明使用權(quán)限如果待訪問的Data聲明了訪問需要權(quán)限,則訪問此Data需要在配置文件中聲明需要此權(quán)限。"reqPermissions":[{"name":"com.example.myapplication5.DataAbility.DATA"},//訪問文件還需要添加訪問存儲(chǔ)讀寫權(quán)限{"name":"ohos.permission.READ_USER_STORAGE"},{"name":"ohos.permission.WRITE_USER_STORAGE"}]創(chuàng)建DataAbilityHelperDataAbilityHelper為開發(fā)者提供了creator()方法來創(chuàng)建DataAbilityHelper實(shí)例。該方法為靜態(tài)方法,有多個(gè)重載。最常見的方法是通過傳入一個(gè)context對(duì)象來創(chuàng)建DataAbilityHelper對(duì)象。獲取helper對(duì)象示例:DataAbilityHelperhelper=DataAbilityHelper.creator(this);訪問DataAbilityDataAbilityHelper為開發(fā)者提供了一系列的接口來訪問不同類型的數(shù)據(jù)(文件、數(shù)據(jù)庫等)。DataAbilityHelper為開發(fā)者提供了FileDescriptoropenFile?(Uriuri,Stringmode)方法來操作文件。此方法需要傳入兩個(gè)參數(shù),其中uri用來確定目標(biāo)資源路徑,mode用來指定打開文件的方式,可選方式包含“r”(讀),“w”(寫),“rw”(讀寫),“wt”(覆蓋寫),“wa”(追加寫),“rwt”(覆蓋寫且可讀)。該方法返回一個(gè)目標(biāo)文件的FD(文件描述符),把文件描述符封裝成流,開發(fā)者就可以對(duì)文件流進(jìn)行自定義處理。訪問文件示例://讀取文件描述符FileDescriptorfd=helper.openFile(uri,"r");//使用文件描述符封裝成的文件流,進(jìn)行文件操作FileInputStreamfis=newFileInputStream(fd);

關(guān)系型數(shù)據(jù)庫關(guān)系型數(shù)據(jù)庫(RelationalDatabase,RDB)是一種基于關(guān)系模型來管理數(shù)據(jù)的數(shù)據(jù)庫。HarmonyOS關(guān)系型數(shù)據(jù)庫基于SQLite組件提供了一套完整的對(duì)本地?cái)?shù)據(jù)庫進(jìn)行管理的機(jī)制,對(duì)外提供了一系列的增、刪、改、查接口,也可以直接運(yùn)行用戶輸入的SQL語句來滿足復(fù)雜的場(chǎng)景需要。HarmonyOS提供的關(guān)系型數(shù)據(jù)庫功能更加完善,查詢效率更高?;靖拍铌P(guān)系型數(shù)據(jù)庫創(chuàng)建在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫,以行和列的形式存儲(chǔ)數(shù)據(jù)。謂詞數(shù)據(jù)庫中用來代表數(shù)據(jù)實(shí)體的性質(zhì)、特征或者數(shù)據(jù)實(shí)體之間關(guān)系的詞項(xiàng),主要用來定義數(shù)據(jù)庫的操作條件。結(jié)果集指用戶查詢之后的結(jié)果集合,可以對(duì)數(shù)據(jù)進(jìn)行訪問。結(jié)果集提供了靈活的數(shù)據(jù)訪問方式,可以更方便的拿到用戶想要的數(shù)據(jù)。SQLite數(shù)據(jù)庫一款輕型的數(shù)據(jù)庫,是遵守ACID的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。它是一個(gè)開源的項(xiàng)目。運(yùn)作機(jī)制HarmonyOS關(guān)系型數(shù)據(jù)庫對(duì)外提供通用的操作接口,底層使用SQLite作為持久化存儲(chǔ)引擎,支持SQLite具有的所有數(shù)據(jù)庫特性,包括但不限于事務(wù)、索引、視圖、觸發(fā)器、外鍵、參數(shù)化查詢和預(yù)編譯SQL語句。接口說明(直接數(shù)據(jù)庫訪問)數(shù)據(jù)庫的增刪改查新增:關(guān)系型數(shù)據(jù)庫提供了插入數(shù)據(jù)的接口,通過ValuesBucket輸入要存儲(chǔ)的數(shù)據(jù),通過返回值判斷是否插入成功,插入成功時(shí)返回最新插入數(shù)據(jù)所在的行號(hào),失敗則返回-1。查詢:關(guān)系型數(shù)據(jù)庫提供了兩種查詢數(shù)據(jù)的方式:直接調(diào)用查詢接口。使用該接口,會(huì)將包含查詢條件的謂詞自動(dòng)拼接成完整的SQL語句進(jìn)行查詢操作,無需用戶傳入原生的SQL。執(zhí)行原生的用于查詢的SQL語句。數(shù)據(jù)庫謂詞的使用關(guān)系型數(shù)據(jù)庫提供了用于設(shè)置數(shù)據(jù)庫操作條件的謂詞AbsRdbPredicates,其中包括兩個(gè)實(shí)現(xiàn)子類RdbPredicates和RawRdbPredicates:RdbPredicates:開發(fā)者無需編寫復(fù)雜的SQL語句,僅通過調(diào)用該類中條件相關(guān)的方法,如equalTo、notEqualTo、groupBy、orderByAsc、beginsWith等,就可自動(dòng)完成SQL語句拼接,方便用戶聚焦業(yè)務(wù)操作。RawRdbPredicates:可滿足復(fù)雜SQL語句的場(chǎng)景,支持開發(fā)者自己設(shè)置where條件子句和whereArgs參數(shù)。不支持equalTo等條件接口的使用。查詢結(jié)果集的使用關(guān)系型數(shù)據(jù)庫提供了查詢返回的結(jié)果集ResultSet,它指向查詢結(jié)果中的一行數(shù)據(jù),供用戶對(duì)查詢結(jié)果進(jìn)行遍歷和訪問。ResultSet的對(duì)外API如下表格。開發(fā)步驟創(chuàng)建數(shù)據(jù)庫:配置數(shù)據(jù)庫相關(guān)信息,包括數(shù)據(jù)庫的名稱、存儲(chǔ)模式、是否為只讀模式等。初始化數(shù)據(jù)庫表結(jié)構(gòu)和相關(guān)數(shù)據(jù)。創(chuàng)建數(shù)據(jù)庫。StoreConfigconfig=StoreConfig.newDefaultConfig("RdbStoreTest.db");privatestaticRdbOpenCallbackcallback=newRdbOpenCallback(){@OverridepublicvoidonCreate(RdbStorestore){store.executeSql("CREATETABLEIFNOTEXISTStest(idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTNOTNULL,ageINTEGER,salaryREAL,blobTypeBLOB)");}@OverridepublicvoidonUpgrade(RdbStorestore,intoldVersion,intnewVersion){}};DatabaseHelperhelper=newDatabaseHelper(context);RdbStorestore=helper.getRdbStore(config,1,callback,null);插入數(shù)據(jù)。構(gòu)造要插入的數(shù)據(jù),以ValuesBucket形式存儲(chǔ)。調(diào)用關(guān)系型數(shù)據(jù)庫提供的插入接口。ValuesBucketvalues=newValuesBucket();values.putInteger("id",1);values.putString("name","zhangsan");values.putInteger("age",18);values.putDouble("salary",100.5);values.putByteArray("blobType",newbyte[]{1,2,3});longid=store.insert("test",values);查詢數(shù)據(jù)。構(gòu)造用于查詢的謂詞對(duì)象,設(shè)置查詢條件。指定查詢返回的數(shù)據(jù)列。調(diào)用查詢接口查詢數(shù)據(jù)。調(diào)用結(jié)果集接口,遍歷返回結(jié)果。String[]columns=newString[]{"id","name","age","salary"};RdbPredicatesrdbPredicates=newRdbPredicates("test").equalTo("age",25).orderByAsc("salary");ResultSetresultSet=store.query(rdbPredicates,columns);resultSet.goToNextRow();對(duì)象關(guān)系映射數(shù)據(jù)庫HarmonyOS對(duì)象關(guān)系映射(ObjectRelationalMapping,ORM)數(shù)據(jù)庫是一款基于SQLite的數(shù)據(jù)庫框架,屏蔽了底層SQLite數(shù)據(jù)庫的SQL操作,針對(duì)實(shí)體和關(guān)系提供了增刪改查等一系列的面向?qū)ο蠼涌?。?yīng)用開發(fā)者不必再去編寫復(fù)雜的SQL語句,以操作對(duì)象的形式來操作數(shù)據(jù)庫,提升效率的同時(shí)也能聚焦于業(yè)務(wù)開發(fā)。基本概念運(yùn)作機(jī)制默認(rèn)配置約束與限制HarmonyOS對(duì)象關(guān)系映射(ObjectRelationalMapping,ORM)數(shù)據(jù)庫是一款基于SQLite的數(shù)據(jù)庫框架,屏蔽了底層SQLite數(shù)據(jù)庫的SQL操作,針對(duì)實(shí)體和關(guān)系提供了增刪改查等一系列的面向?qū)ο蠼涌凇?yīng)用開發(fā)者不必再去編寫復(fù)雜的SQL語句,以操作對(duì)象的形式來操作數(shù)據(jù)庫,提升效率的同時(shí)也能聚焦于業(yè)務(wù)開發(fā)?;靖拍顚?duì)象關(guān)系映射數(shù)據(jù)庫的三個(gè)主要組件:數(shù)據(jù)庫:被開發(fā)者用@Database注解,且繼承了OrmDatabase的類,對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫。實(shí)體對(duì)象:被開發(fā)者用@Entity注解,且繼承了OrmObject的類,對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫中的表。對(duì)象數(shù)據(jù)操作接口:包括數(shù)據(jù)庫操作的入口OrmContext類和謂詞接口(OrmPredicate)等。謂詞:數(shù)據(jù)庫中是用來代表數(shù)據(jù)實(shí)體的性質(zhì)、特征或者數(shù)據(jù)實(shí)體之間關(guān)系的詞項(xiàng),主要用來定義數(shù)據(jù)庫的操作條件。對(duì)象關(guān)系映射數(shù)據(jù)庫將SQLite數(shù)據(jù)庫中的謂詞封裝成了接口方法供開發(fā)者調(diào)用。開發(fā)者通過對(duì)象數(shù)據(jù)操作接口,可以訪問到應(yīng)用持久化的關(guān)系型數(shù)據(jù)。對(duì)象關(guān)系映射:數(shù)據(jù)庫通過將實(shí)例對(duì)象映射到關(guān)系上,實(shí)現(xiàn)使用操作實(shí)例對(duì)象的語法,來操作關(guān)系型數(shù)據(jù)庫。它是在SQLite數(shù)據(jù)庫的基礎(chǔ)上提供的一個(gè)抽象層。SQLite數(shù)據(jù)庫:一款輕型的數(shù)據(jù)庫,是遵守ACID的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。運(yùn)作機(jī)制對(duì)象關(guān)系映射數(shù)據(jù)庫操作是基于關(guān)系型數(shù)據(jù)庫操作接口完成的,實(shí)際是在關(guān)系型數(shù)據(jù)庫操作的基礎(chǔ)上又實(shí)現(xiàn)了對(duì)象關(guān)系映射等特性。因此對(duì)象關(guān)系映射數(shù)據(jù)庫跟關(guān)系型數(shù)據(jù)庫一樣,都使用SQLite作為持久化引擎,底層使用的是同一套數(shù)據(jù)庫連接池和數(shù)據(jù)庫連接機(jī)制。使用對(duì)象關(guān)系映射數(shù)據(jù)庫的開發(fā)者需要先配置實(shí)體模型與關(guān)系映射文件。應(yīng)用數(shù)據(jù)管理框架提供的類生成工具會(huì)解析這些文件,生成數(shù)據(jù)庫幫助類,這樣應(yīng)用數(shù)據(jù)管理框架就能在運(yùn)行時(shí),根據(jù)開發(fā)者的配置創(chuàng)建好數(shù)據(jù)庫,并在存儲(chǔ)過程中自動(dòng)完成對(duì)象關(guān)系映射。開發(fā)者再通過對(duì)象數(shù)據(jù)操作接口,如OrmContext接口和謂詞接口等操作持久化數(shù)據(jù)庫。對(duì)象數(shù)據(jù)操作接口提供一組基于對(duì)象映射的數(shù)據(jù)操作接口,實(shí)現(xiàn)了基于SQL的關(guān)系模型數(shù)據(jù)到對(duì)象的映射,讓用戶不需要再和復(fù)雜的SQL語句打交道,只需簡(jiǎn)單地操作實(shí)體對(duì)象的屬性和方法。對(duì)象數(shù)據(jù)操作接口支持對(duì)象的增刪改查操作,同時(shí)支持事務(wù)操作等。約束與限制ORD開發(fā)過程對(duì)象關(guān)系映射數(shù)據(jù)庫目前可以支持?jǐn)?shù)據(jù)庫和表的創(chuàng)建,對(duì)象數(shù)據(jù)的增刪改查、對(duì)象數(shù)據(jù)變化回調(diào)、數(shù)據(jù)庫升降級(jí)和備份等功能。創(chuàng)建數(shù)據(jù)庫。開發(fā)者需要定義一個(gè)表示數(shù)據(jù)庫的類,繼承OrmDatabase,再通過@Database注解內(nèi)的entities屬性指定哪些數(shù)據(jù)模型類屬于這個(gè)數(shù)據(jù)庫。創(chuàng)建數(shù)據(jù)表。開發(fā)者可通過創(chuàng)建一個(gè)繼承了OrmObject并用@Entity注解的類,獲取數(shù)據(jù)庫實(shí)體對(duì)象,也就是表的對(duì)象。屬性:初始化數(shù)據(jù)庫連接系統(tǒng)會(huì)在應(yīng)用啟動(dòng)時(shí)調(diào)用onStart()方法創(chuàng)建Data實(shí)例。在此方法中,開發(fā)者應(yīng)該創(chuàng)建數(shù)據(jù)庫連接,并獲取連接對(duì)象,以便后續(xù)和數(shù)據(jù)庫進(jìn)行操作。為了避免影響應(yīng)用啟動(dòng)速度,開發(fā)者應(yīng)當(dāng)盡可能將非必要的耗時(shí)任務(wù)推遲到使用時(shí)執(zhí)行,而不是在此方法中執(zhí)行所有初始化。數(shù)據(jù)庫操作-ORMapping(ORM)query():該方法接收三個(gè)參數(shù),分別是查詢的目標(biāo)路徑,查詢的列名,以及查詢條件,查詢條件由類DataAbilityPredicates構(gòu)建。根據(jù)傳入的列名和查詢條件查詢用戶表的代碼示例如下:insert():該方法接收兩個(gè)參數(shù),分別是插入的目標(biāo)路徑和插入的數(shù)據(jù)值。其中,插入的數(shù)據(jù)由ValuesBucket封裝,服務(wù)端可以從該參數(shù)中解析出對(duì)應(yīng)的屬性,然后插入到數(shù)據(jù)庫中。此方法返回一個(gè)int類型的值用于標(biāo)識(shí)結(jié)果。delete():該方法用來執(zhí)行刪除操作。刪除條件由類DataAbilityPredicates構(gòu)建,服務(wù)端在接收到該參數(shù)之后可以從中解析出要?jiǎng)h除的數(shù)據(jù),然后到數(shù)據(jù)庫中執(zhí)行。數(shù)據(jù)端開發(fā)步驟配置“build.gradle”文件。如果使用注解處理器(Annotation)的模塊為“com.huawei.ohos.hap”模塊,則需要在模塊的“build.gradle”文件的“ohos”節(jié)點(diǎn)中添加以下配置。注解器的作用就是在數(shù)據(jù)庫和對(duì)象之間形成映射,把記錄映射為實(shí)體類,將數(shù)據(jù)庫操作映射為對(duì)象操作,該過程會(huì)自動(dòng)生成一些實(shí)體操作服務(wù)類。compileOptions{annotationEnabledtrue}構(gòu)造數(shù)據(jù)庫,即創(chuàng)建數(shù)據(jù)庫類并配置對(duì)應(yīng)的屬性。如定義了一個(gè)數(shù)據(jù)庫類BookStore.java,數(shù)據(jù)庫包含了“User”,"Book","AllDataType"三個(gè)表@Database(entities={User.class,Book.class,AllDataType.class},version=1)publicabstractclassBookStoreextendsOrmDatabase{}構(gòu)造數(shù)據(jù)表,即創(chuàng)建數(shù)據(jù)庫實(shí)體類并配置對(duì)應(yīng)的屬性(如對(duì)應(yīng)表的主鍵,外鍵等)。數(shù)據(jù)表必須與其所在的數(shù)據(jù)庫在同一個(gè)模塊中。例如,定義了一個(gè)實(shí)體類User.java,對(duì)應(yīng)數(shù)據(jù)庫內(nèi)的表名為”user”;indices為”firstName”和”lastName”兩個(gè)字段建立了復(fù)合索引”name_index”,并且索引值是唯一的;”ignoreColumns”表示該字段不需要添加到”user”表的屬性中。示例@Entity(tableName="user",ignoredColumns={"ignoreColumn1","ignoreColumn2"},indices={@Index(value={"firstName","lastName"},name="name_index",unique=true)})publicclassUserextendsOrmObject{//此處將userId設(shè)為了自增的主鍵。注意只有在數(shù)據(jù)類型為包裝類型時(shí),自增主鍵才能生效。@PrimaryKey(autoGenerate=true)privateIntegeruserId;privateStringfirstName;privateStringlastName;privateintage;privatedoublebalance;privateintignoreColumn1;privateintignoreColumn2;//自行編寫setter和getter方法}使用對(duì)象數(shù)據(jù)操作接口OrmContext創(chuàng)建數(shù)據(jù)庫。例如,通過對(duì)象數(shù)據(jù)操作接口OrmContext,創(chuàng)建一個(gè)別名為“BookStore”,數(shù)據(jù)庫文件名為“BookStore.db”的數(shù)據(jù)庫。如果數(shù)據(jù)庫已經(jīng)存在,執(zhí)行以下代碼不會(huì)重復(fù)創(chuàng)建。通過context.getDatabaseDir()可以獲取創(chuàng)建的數(shù)據(jù)庫文件所在的目錄。DatabaseHelperhelper=newDatabaseHelper(context);//context入?yún)㈩愋蜑閛hos.app.Context,注意不要使用slice.getContext()來獲取context,請(qǐng)直接傳入slice,否則會(huì)出現(xiàn)找不到類的報(bào)錯(cuò)。OrmContextcontext=helper.getOrmContext("BookStore","BookStore.db",BookStore.class);Data

Ability數(shù)據(jù)庫操作服務(wù)Ability定義了6個(gè)方法供用戶處理對(duì)數(shù)據(jù)庫表數(shù)據(jù)的增刪改查。這6個(gè)方法在Ability中已默認(rèn)實(shí)現(xiàn),開發(fā)者可按需重寫。

使用對(duì)象數(shù)據(jù)操作接口OrmContext對(duì)數(shù)據(jù)庫進(jìn)行增刪改查、注冊(cè)觀察者、備份數(shù)據(jù)庫等。增加數(shù)據(jù)。例如,在數(shù)據(jù)庫的名為“user”的表中,新建一個(gè)User對(duì)象并設(shè)置對(duì)象的屬性。直接傳入OrmObject對(duì)象的增加接口,只有在flush()接口被調(diào)用后才會(huì)持久化到數(shù)據(jù)庫中。Useruser=newUser();user.setFirstName("Zhang");user.setLastName("San");user.setAge(29);user.setBalance(100.51);booleanisSuccessed=context.insert(user);isSuccessed=context.flush();訪問數(shù)據(jù)庫-客戶端編寫數(shù)據(jù)庫操作方法:DataAbilityHelper為開發(fā)者提供了增、刪、改、查以及批量處理等方法來操作數(shù)據(jù)庫。這幾個(gè)方法與Ability對(duì)象自有的六個(gè)方法是一致的。query():查詢方法,其中uri為目標(biāo)資源路徑,columns為想要查詢的字段。開發(fā)者的查詢條件可以通過DataAbilityPredicates來構(gòu)建。查詢用戶表中id在101-103之間的用戶,并把結(jié)果打印出來,代碼示例如下:DataAbilityHelperhelper=DataAbilityHelper.creator(this);//構(gòu)造查詢條件DataAbilityPredicatespredicates=newDataAbilityPredicates();predicates.between("userId",101,103);//進(jìn)行查詢ResultSetresultSet=helper.query(uri,columns,predicates);//處理結(jié)果resultSet.goToFirstRow();do{//在此處理ResultSet中的記錄;}while(resultSet.goToNextRow());insert():新增方法,其中uri為目標(biāo)資源路徑,ValuesBucket為要新增的對(duì)象。插入一條用戶信息的代碼示例如下:DataAbilityHelperhelper=DataAbilityHelper.creator(this);//構(gòu)造插入數(shù)據(jù)ValuesBucketvaluesBucket=newValuesBucket();valuesBucket.putString("name","Tom");valuesBucket.putInteger("age",12);helper.insert(uri,valuesBucket);輕量級(jí)偏好數(shù)據(jù)庫輕量級(jí)偏好數(shù)據(jù)庫主要提供輕量級(jí)Key-Value操作,支持本地應(yīng)用存儲(chǔ)少量數(shù)據(jù),數(shù)據(jù)存儲(chǔ)在本地文件中,同時(shí)也加載在內(nèi)存中的,所以訪問速度更快,效率更高。輕量級(jí)偏好數(shù)據(jù)庫屬于非關(guān)系型數(shù)據(jù)庫,不宜存儲(chǔ)大量數(shù)據(jù),經(jīng)常用于操作鍵值對(duì)形式數(shù)據(jù)的場(chǎng)景?;靖拍頚ey-Value數(shù)據(jù)庫一種以鍵值對(duì)存儲(chǔ)數(shù)據(jù)的一種數(shù)據(jù)庫,類似Java中的map。Key是關(guān)鍵字,Value是值。非關(guān)系型數(shù)據(jù)庫區(qū)別于關(guān)系數(shù)據(jù)庫,不保證遵循ACID(Atomic、Consistency、Isolation及Durability)特性,不采用關(guān)系模型來組織數(shù)據(jù),數(shù)據(jù)之間無關(guān)系,擴(kuò)展性好。偏好數(shù)據(jù)用戶經(jīng)常訪問和使用的數(shù)據(jù)。運(yùn)作機(jī)制本模塊提供偏好型數(shù)據(jù)庫的操作類,應(yīng)用通過這些操作類完成數(shù)據(jù)庫操作。借助DatabaseHelperAPI,應(yīng)用可以將指定文件的內(nèi)容加載到Preferences實(shí)例,每個(gè)文件最多有一個(gè)Preferences實(shí)例,系統(tǒng)會(huì)通過靜態(tài)容器將該實(shí)例存儲(chǔ)在內(nèi)存中,直到應(yīng)用主動(dòng)從內(nèi)存中移除該實(shí)例或者刪除該文件。獲取到文件對(duì)應(yīng)的Preferences實(shí)例后,應(yīng)用可以借助PreferencesAPI,從Preferences實(shí)例中讀取數(shù)據(jù)或者將數(shù)據(jù)寫入Preferences實(shí)例,通過flush或者flushSync將Preferences實(shí)例持久化。創(chuàng)建數(shù)據(jù)庫通過數(shù)據(jù)庫操作的輔助類可以獲取到要操作的Preferences實(shí)例,用于進(jìn)行數(shù)據(jù)庫的操作。通過調(diào)用Get系列的方法,可以查詢不同類型的數(shù)據(jù)。插入數(shù)據(jù):通過Put系列的方法可以修改Preferences實(shí)例中的數(shù)據(jù),通過flush或者flushSync將Preferences實(shí)例持久化。刪除數(shù)據(jù)文件:通過調(diào)用以下兩種接口,可以刪除數(shù)據(jù)文件。移動(dòng)數(shù)據(jù)庫文件。開發(fā)步驟準(zhǔn)備工作,導(dǎo)入對(duì)輕量級(jí)偏好數(shù)據(jù)庫SDK到開發(fā)環(huán)境。獲取Preferences實(shí)例。讀取指定文件,將數(shù)據(jù)加載到Preferences實(shí)例,用于數(shù)據(jù)操作。DatabaseHelperdatabaseHelper=newDatabaseHelper(context);//context入?yún)㈩愋蜑閛hos.app.Context。StringfileName="name";//fileName表示文件名,其取值不能為空,也不能包含路徑,默認(rèn)存儲(chǔ)目錄可以通過context.getPreferencesDir()獲取。Preferencespreferences=databaseHelper.getPreferences(fileName);從指定文件讀取數(shù)據(jù)。首先獲取指定文件對(duì)應(yīng)的Preferences實(shí)例,然后借助PreferencesAPI讀取數(shù)據(jù)。如java接口讀取整型數(shù)據(jù)intvalue=preferences.getInt("intKey",0);將數(shù)據(jù)寫入指定文件。首先獲取指定文件對(duì)應(yīng)的Preferences實(shí)例,然后借助PreferencesAPI將數(shù)據(jù)寫入Preferences實(shí)例,通過flush或者flushSync將Preferences實(shí)例持久化。preferences.putInt("intKey",3);preferences.putString("StringKey","Stringvalue");preferences.flush();注冊(cè)觀察者:開發(fā)者可以向Preferences實(shí)例注冊(cè)觀察者,觀察者對(duì)象需實(shí)現(xiàn)Preferences.PreferencesObserver接口。flushSync()或flush()執(zhí)行后,該P(yáng)references實(shí)例注冊(cè)的所有觀察者的onChange()方法都會(huì)被回調(diào)。privateclassPreferencesChangeCounterimplementsPreferences.PreferencesObserver{finalAtomicIntegernotifyTimes=newAtomicInteger(0);@OverridepublicvoidonChange(Preferencespreferences,Stringkey){if("intKey".equals(key)){notifyTimes.incrementAndGet();}}}PreferencesChangeCountercounter=newPreferencesChangeCounter();preferences.registerObserver(counter);//向preferences實(shí)例注冊(cè)觀察者preferences.putInt("intKey",3);//修改數(shù)據(jù)booleanresult=preferences.flushSync();//修改數(shù)據(jù)后,onChange方法會(huì)被回調(diào)intnotifyTimes=counter.notifyTValue();preferences.unRegisterObserver(counter);//向preferences實(shí)例注銷觀察者分布式數(shù)據(jù)庫分布式數(shù)據(jù)服務(wù)(DistributedDataService,DDS)為應(yīng)用程序提供不同設(shè)備間數(shù)據(jù)庫數(shù)據(jù)分布式的能力。通過調(diào)用分布式數(shù)據(jù)接口,應(yīng)用程序?qū)?shù)據(jù)保存到分布式數(shù)據(jù)庫中。通過結(jié)合帳號(hào)、應(yīng)用和數(shù)據(jù)庫三元組,分布式數(shù)據(jù)服務(wù)對(duì)屬于不同的應(yīng)用的數(shù)據(jù)進(jìn)行隔離,保證不同應(yīng)用之間的數(shù)據(jù)不能通過分布式數(shù)據(jù)服務(wù)互相訪問。在通過可信認(rèn)證的設(shè)備間,分布式數(shù)據(jù)服務(wù)支持應(yīng)用數(shù)據(jù)相互同步,為用戶提供在多種終端設(shè)備上一致的數(shù)據(jù)訪問體驗(yàn)。KV數(shù)據(jù)模型“KV數(shù)據(jù)模型”是“Key-Value數(shù)據(jù)模型”的簡(jiǎn)稱,“Key-Value”即“鍵-值”。它是一種NoSQL類型數(shù)據(jù)庫,其數(shù)據(jù)以鍵值對(duì)的形式進(jìn)行組織、索引和存儲(chǔ)。KV數(shù)據(jù)模型適合不涉及過多數(shù)據(jù)關(guān)系和業(yè)務(wù)關(guān)系的業(yè)務(wù)數(shù)據(jù)存儲(chǔ),比SQL數(shù)據(jù)庫存儲(chǔ)擁有更好的讀寫性能,同時(shí)因在分布式場(chǎng)景中降低了數(shù)據(jù)庫版本兼容和數(shù)據(jù)同步過程中沖突解決的復(fù)雜度而被廣泛使用。分布式數(shù)據(jù)庫也是基于KV數(shù)據(jù)模型,對(duì)外提供KV類型的訪問接口。分布式數(shù)據(jù)庫ACID特性分布式數(shù)據(jù)庫事務(wù)性:分布式數(shù)據(jù)庫事務(wù)支持本地事務(wù)(和傳統(tǒng)數(shù)據(jù)庫的事務(wù)概念一致)和同步事務(wù),同步事務(wù)是指在設(shè)備之間同步數(shù)據(jù)時(shí),是以本地事務(wù)為單位進(jìn)行同步,一次本地事務(wù)的修改要么都同步成功,要么都同步失敗。分布式數(shù)據(jù)庫一致性:在分布式場(chǎng)景中一般會(huì)涉及多個(gè)設(shè)備,組網(wǎng)內(nèi)設(shè)備之間看到的數(shù)據(jù)是否一致稱為分布式數(shù)據(jù)庫的一致性。分布式數(shù)據(jù)庫一致性可以分為強(qiáng)一致性、弱一致性和最終一致性。強(qiáng)一致性:是指某一設(shè)備成功增、刪、改數(shù)據(jù)后,組網(wǎng)內(nèi)設(shè)備對(duì)該數(shù)據(jù)的讀取操作都將得到更新后的值。弱一致性:是指某一設(shè)備成功增、刪、改數(shù)據(jù)后,組網(wǎng)內(nèi)設(shè)備可能能讀取到本次更新數(shù)據(jù),也可能讀取不到,不能保證在多長(zhǎng)時(shí)間后每個(gè)設(shè)備的數(shù)據(jù)一定是一致的。最終一致性:是指某一設(shè)備成功增、刪、改數(shù)據(jù)后,組網(wǎng)內(nèi)設(shè)備可能讀取不到本次更新數(shù)據(jù),但在某個(gè)時(shí)間窗口之后組網(wǎng)內(nèi)設(shè)備的數(shù)據(jù)能夠達(dá)到一致狀態(tài)。運(yùn)作機(jī)制分布式數(shù)據(jù)服務(wù)支撐HarmonyOS系統(tǒng)上應(yīng)用程序數(shù)據(jù)庫數(shù)據(jù)分布式管理,支持?jǐn)?shù)據(jù)在相同帳號(hào)的多端設(shè)備之間相互同步,為用戶在多端設(shè)備上提供一致的用戶體驗(yàn),分布式數(shù)據(jù)服務(wù)包含五部分:服務(wù)接口:分布式數(shù)據(jù)服務(wù)提供專門的數(shù)據(jù)庫創(chuàng)建、數(shù)據(jù)訪問、數(shù)據(jù)訂閱等接口給應(yīng)用程序調(diào)用,接口支持KV數(shù)據(jù)模型,支持常用的數(shù)據(jù)類型,同時(shí)確保接口的兼容性、易用性和可發(fā)布性。服務(wù)組件:負(fù)責(zé)服務(wù)內(nèi)元數(shù)據(jù)管理、權(quán)限管理、加密管理、備份和恢復(fù)管理以及多用戶管理等、同時(shí)負(fù)責(zé)初始化底層分布式DB的存儲(chǔ)組件、同步組件和通信適配層。存儲(chǔ)組件:負(fù)責(zé)數(shù)據(jù)的訪問、數(shù)據(jù)的縮減、事務(wù)、快照、數(shù)據(jù)庫加密,以及數(shù)據(jù)合并和沖突解決等特性。同步組件:連結(jié)了存儲(chǔ)組件與通信組件,其目標(biāo)是保持在線設(shè)備間的數(shù)據(jù)庫數(shù)據(jù)一致性,包括將本地產(chǎn)生的未同步數(shù)據(jù)同步給其他設(shè)備,接收來自其他設(shè)備發(fā)送過來的數(shù)據(jù),并合并到本地設(shè)備中。通信適配層:負(fù)責(zé)調(diào)用底層公共通信層的接口完成通信管道的創(chuàng)建、連接,接收設(shè)備上下線消息,維護(hù)已連接和斷開設(shè)備列表的元數(shù)據(jù),同時(shí)將設(shè)備上下線信息發(fā)送給上層同步組件,同步組件維護(hù)連接的設(shè)備列表,同步數(shù)據(jù)時(shí)根據(jù)該列表,調(diào)用通信適配層的接口將數(shù)據(jù)封裝并發(fā)送給連接的設(shè)備。應(yīng)用程序通過調(diào)用分布式數(shù)據(jù)服務(wù)接口實(shí)現(xiàn)分布式數(shù)據(jù)庫創(chuàng)建、訪問、訂閱功能,服務(wù)接口通過操作服務(wù)組件提供的能力,將數(shù)據(jù)存儲(chǔ)至存儲(chǔ)組件,存儲(chǔ)組件調(diào)用同步組件實(shí)現(xiàn)將數(shù)據(jù)同步,同步組件使用通信適配層將數(shù)據(jù)同步至遠(yuǎn)端設(shè)備,遠(yuǎn)端設(shè)備通過同步組件接收數(shù)據(jù),并更新至本端存儲(chǔ)組件,通過服務(wù)接口提供給應(yīng)用程序使用。

應(yīng)用數(shù)據(jù)Harmony跨設(shè)備數(shù)據(jù)庫訪問

數(shù)據(jù)庫操作:

增刪改查訂閱HarmonyOS分布式數(shù)據(jù)庫存儲(chǔ)引擎同步管理通信組件?

接口本地/遠(yuǎn)程訪問透明,便捷高效;?

同步?jīng)_突自動(dòng)解決,保證數(shù)據(jù)最終一致性。KvStoreObserver

kvObserver

=

new

KvStoreObserver()

{

@Override

public

void

onChange(ChangeNotification

changeNotification)

{

//

業(yè)務(wù)處理邏輯

}}//創(chuàng)建分布式數(shù)據(jù)庫,設(shè)置成自動(dòng)同步KvStore

kvStore

=

kvManager.getKvStore(new

Options().setAutoSync(true),

FileMetaDB);

//

訂閱數(shù)據(jù)庫變更通知;kvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_REMOTE,

kvObserver);//

寫入一條數(shù)據(jù);kvStore.putString(fileKey,

filePath);//感知對(duì)端數(shù)據(jù)變化,業(yè)務(wù)邏輯處理;分布式數(shù)據(jù)庫技術(shù)

代碼示例應(yīng)用應(yīng)用File

Ext

APIPOSIX應(yīng)用應(yīng)用HarmonyOS分布式文件系統(tǒng)Cache

引擎元數(shù)據(jù)

管理通信組件分布式文件融合統(tǒng)一視圖//

獲取應(yīng)用分布式目錄//設(shè)備A寫入:File

distDir

=

context.getDistributedDir();File

distFile

=

new

File(distDir,

"hello.jpg");

//

創(chuàng)建分布式文件對(duì)象FileOutputStream

stream

=

new

FileOutputStream(distFile);

//

寫分布式文件

stream.write(...);File

distDir

=

context.getDistributedDir();//

獲取應(yīng)用分布式目錄//設(shè)備B讀?。?/p>

stream.read(...);?

接口簡(jiǎn)單,兼容POSIX,應(yīng)用可無縫遷移;?

屏蔽儲(chǔ)存位置差異,數(shù)據(jù)隨人不隨設(shè)備。//

讀分布式文件File

distFile

=

new

File(distDir,

"hello.jpg");

//

創(chuàng)建分布式文件對(duì)象FileInputStream

stream

=

new

FileInputStream(distFile);分布式文件系統(tǒng)技術(shù)

代碼示例分布式文件系統(tǒng)分布式文件服務(wù)能夠?yàn)橛脩粼O(shè)備中的應(yīng)用程序提供多設(shè)備之間的文件共享能力,支持相同帳號(hào)下同一應(yīng)用文件的跨設(shè)備訪問,應(yīng)用程序可以不感知文件所在的存儲(chǔ)設(shè)備,能夠在多個(gè)設(shè)備之間無縫獲取文件。分布式文件:分布式文件是指依賴于分布式文件系統(tǒng),分散存儲(chǔ)在多個(gè)用戶設(shè)備上的文件,應(yīng)用間的分布式文件目錄互相隔離,不同應(yīng)用的文件不能互相訪問。文件元數(shù)據(jù):文件元數(shù)據(jù)是用于描述文件特征的數(shù)據(jù),包含文件名,文件大小,創(chuàng)建、訪問、修改時(shí)間等信息。

溫馨提示

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

評(píng)論

0/150

提交評(píng)論