版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章DataAbility引言本章學(xué)習(xí)目標(biāo)理解HarmonyOS數(shù)據(jù)應(yīng)用(DataAbility)的基本概念熟悉創(chuàng)建DataAbility的步驟,理解DataAbility中各方法的含義2了解使用DataAbility訪問本地文件熟練對(duì)本地?cái)?shù)據(jù)庫進(jìn)行增刪改查第9章DataAbility9.1DataAbility概述9.2Data的創(chuàng)建9.3Data的訪問39.1DataAbility概述4數(shù)據(jù)的存儲(chǔ)方式多種多樣,可以是傳統(tǒng)意義上的數(shù)據(jù)庫系統(tǒng),也可以是本地磁盤上的文件。Data對(duì)外提供對(duì)數(shù)據(jù)的增、刪、改、查,以及打開文件等接口,這些接口的具體實(shí)現(xiàn)由開發(fā)者提供。Data的提供方和使用方都通過URI(UniformResourceIdentifier,統(tǒng)一資源定位符)來標(biāo)識(shí)一個(gè)具體的數(shù)據(jù),例如數(shù)據(jù)庫中的某個(gè)表或磁盤上的某個(gè)文件。HarmonyOS的URI仍基于URI通用標(biāo)準(zhǔn)格式如圖所示。dataability:///com.example.addressbookdemo.UserDataAbility/usersdataability://device_id/com.example.addressbookdemo.UserDataAbility/usersURI示例代碼如下:第9章DataAbility9.1DataAbility概述9.2Data的創(chuàng)建9.3Data的訪問59.2Data的創(chuàng)建6創(chuàng)建Data時(shí),首先需要確定數(shù)據(jù)的存儲(chǔ)方式,在Data中不同的數(shù)據(jù)存儲(chǔ)方式給出了不同的操作方法。Data支持以下兩種數(shù)據(jù)形式分別是:文件型數(shù)據(jù)、結(jié)構(gòu)化型數(shù)據(jù)(數(shù)據(jù)庫)。創(chuàng)建一個(gè)名為DataAbilityOnFile的應(yīng)用來演示創(chuàng)建Data、介紹文件型數(shù)據(jù)的操作方法。9.2Data的創(chuàng)建7publicclassDataAbilityextendsAbility{privatestaticfinalHiLogLabelLABEL_LOG=newHiLogLabel(3,0xD001100,"Demo");@OverridepublicvoidonStart(Intentintent){super.onStart(intent);HiL(LABEL_LOG,"DataAbilityonStart");}@OverridepublicResultSetquery(Uriuri,String[]columns,DataAbilityPredicatespredicates){returnnull;}新創(chuàng)建的Data內(nèi)容如下:9.2Data的創(chuàng)建8
@Overridepublicintinsert(Uriuri,ValuesBucketvalue){HiL(LABEL_LOG,"DataAbilityinsert");return999;}@Overridepublicintdelete(Uriuri,DataAbilityPredicatespredicates){return0;}@Overridepublicintupdate(Uriuri,ValuesBucketvalue,DataAbilityPredicatespredicates){return0;}9.2Data的創(chuàng)建9
@OverridepublicFileDescriptoropenFile(Uriuri,Stringmode){returnnull;}
@OverridepublicString[]getFileTypes(Uriuri,StringmimeTypeFilter){returnnewString[0];}
@OverridepublicPacMapcall(Stringmethod,Stringarg,PacMapextras){returnnull;}
@OverridepublicStringgetType(Uriuri){returnnull;}}第9章DataAbility9.1DataAbility概述9.2Data的創(chuàng)建9.3Data的訪問109.3Data的訪問11可以通過DataAbilityHelper類來訪問當(dāng)前應(yīng)用或其他應(yīng)用提供的共享數(shù)據(jù)。DataAbilityHelper作為客戶端,與提供方的Data進(jìn)行通信。Data接收到請(qǐng)求后,執(zhí)行相應(yīng)的處理,并返回結(jié)果DataAbilityHelper提供了一系列與Data對(duì)應(yīng)的方法。1.聲明使用權(quán)限:如果待訪問的Data聲明了訪問需要的權(quán)限,則訪問此Data需要在配置文件中聲明需要此權(quán)限示例代碼如下:"reqPermissions":[{"name":"com.example.dataabilityonfile.DataAbilityOnFile.DATA"},//訪問文件還需要添加訪問存儲(chǔ)讀寫權(quán)限{"name":"ohos.permission.READ_USER_STORAGE"},{"name":"ohos.permission.WRITE_USER_STORAGE"}9.3Data的訪問122.創(chuàng)建DataAbilityHelperDataAbilityHelper為開發(fā)者提供了creator()方法來創(chuàng)建DataAbilityHelper實(shí)例。該方法為靜態(tài)方法,有多個(gè)重載。常見的方法是通過傳入一個(gè)context對(duì)象來創(chuàng)建DataAbilityHelper對(duì)象。示例代碼如下:DataAbilityHelperdataAbilityHelper=DataAbilityHelper.creator(this);3.訪問DataDataAbilityHelper為開發(fā)者提供了一系列的接口來訪問不同類型的數(shù)據(jù),比如文件、數(shù)據(jù)庫等。訪問數(shù)據(jù)庫:DataAbilityHelper為開發(fā)者提供了增、刪、改、查以及批量處理等方法來操作數(shù)據(jù)庫。如下表所示。方法名中文描述ResultSetquery(Uriuri,String[]columns,DataAbilityPredicatespredicates)查詢數(shù)據(jù)庫intinsert(Uriuri,ValuesBucketvalue)向數(shù)據(jù)庫中插入單條數(shù)據(jù)intinsert(Uriuri,ValuesBucketvalue)刪除一條或多條數(shù)據(jù)intupdate(Uriuri,ValuesBucketvalue,DataAbilityPredicatespredicates)更新數(shù)據(jù)庫9.3Data的訪問13這些方法的使用說明如下:query()查詢方法,其中uri為目標(biāo)資源路徑,columns為想要查詢的字段(也是查詢后想要返回的結(jié)果)。開發(fā)者的查詢條件可以通過DataAbilityPredicates類來構(gòu)建。示例代碼如下:DataAbilityHelperdataAbilityHelper=DataAbilityHelper.creator(this);//訪問Data時(shí)用的URIUriuri=Uri.parse(“dataability:///com.example.addressbookdemo.UserDataAbility/Users”);//指定查詢返回的數(shù)據(jù)列String[]columns=newString[]{“ID”,“NAME”,“TEL”};//設(shè)置查詢條件DataAbilityPredicatesdataAbilityPredicatesicates=newDataAbilityPredicates();//查詢數(shù)據(jù)庫,得到結(jié)果集ResultSetresultSet=dataAbilityHelper.query(uri,columns,dataAbilityPredicatesicates);//處理結(jié)果resultSet.goToFirstRow();do{ //在此處理結(jié)果集中的記錄}while(resultSet.goToNextRow());9.3Data的訪問14HarmonyOS還提供了putInteger(StringcolumnName,Integervalue)、putDouble(StringcolumnName,Doublevalue)等方法,適應(yīng)不同的數(shù)據(jù)類型。示例代碼如下:DataAbilityHelperdataAbilityHelper=DataAbilityHelper.creator(this);//把數(shù)據(jù)封裝到valuesBucket中ValuesBucketvaluesBucket=newValuesBucket();valuesBucket.putString("NAME","ZHANGSAN");valuesBucket.putInteger("TEL";//插入一條數(shù)據(jù)dataAbilityHelper.insert(uri,valuesBucket);delete()刪除方法,其中刪除條件可以通過DataAbilityPredicates來構(gòu)建。示例代碼如下:DataAbilityHelperdataAbilityHelper=DataAbilityHelper.creator(this);//設(shè)置刪除條件DataAbilityPredicatesdataAbilityPredicates=newDataAbilityPredicates();//根據(jù)ID刪除數(shù)據(jù)dataAbilityPredicates.equalTo(“ID”,2);//刪除ID為2的數(shù)據(jù)dataAbilityHelper.delete(uri,dataAbilityPredicates);9.3Data的訪問15update()更新方法,更新數(shù)據(jù)由ValuesBucket傳入,更新條件由DataAbilityPredicates來構(gòu)建。示例代碼如下:DataAbilityHelperdataAbilityHelper=DataAbilityHelper.creator(this);//設(shè)置更新條件DataAbilityPredicatesdataAbilityPredicates=newDataAbilityPredicates();//根據(jù)ID更新數(shù)據(jù)dataAbilityPredicates.equalTo(“ID”,2);//把數(shù)據(jù)封裝到valuesBucket中ValuesBucketvaluesBucket=newValuesBucket();valuesBucket.putString("NAME","ZHANGSAN");valuesBucket.putInteger("TEL";//更新ID為2的數(shù)據(jù)dataAbilityHelper.update(uri,valuesBucket,dataAbilityPredicates);9.3.1案例:訪問文件16下面介紹使用DataAbilityHelper訪問文件的具體步驟。創(chuàng)建一個(gè)名為DataAbilityOnFile的Data,修改內(nèi)容如下:publicclassDataAbilityOnFileextendsAbility{//定義日志標(biāo)簽
privatestaticfinalHiLogLabelLABEL_LOG=newHiLogLabel(HiLog.LOG_APP,0x00922,"DataAbilityOnFile");@OverridepublicvoidonStart(Intentintent){super.onStart(intent);}@OverridepublicFileDescriptoropenFile(Uriuri,Stringmode){HiL(LABEL_LOG,"openFile()方法被調(diào)用");//獲取文件名
StringfileName=uri.getDecodedPathList().get(1);//文件路徑
StringPath=getDataDir()+File.separator+fileName;9.3.1案例:訪問文件17 //創(chuàng)建文件對(duì)象
FileFile=newFile(Path);try{//如果文件不存在,那么創(chuàng)建該文本文件,并且設(shè)置文本內(nèi)容
if(!File.exists()){createFile(Path);}//獲取文件描述符對(duì)象并返回
FileInputStreamfileIs=newFileInputStream(File);FileDescriptorfileDescriptor=fileIs.getFD();//綁定文件描述符
returnMessageParcel.dupFileDescriptor(fileDescriptor);}catch(IOExceptione){e.printStackTrace();}returnnull; } //創(chuàng)建文本文件,并且設(shè)置文本內(nèi)容
privatestaticvoidcreateFile(Stringpath)throwsIOException{ HiL(LABEL_LOG,"createFile()方法被調(diào)用"); //獲得BufferedWriter對(duì)象
BufferedWriterbw=newBufferedWriter(newFileWriter(path));9.3.1案例:訪問文件18 //寫字符串
bw.write("測(cè)試數(shù)據(jù)");//關(guān)閉BufferedWriterbw.close();}@OverridepublicString[]getFileTypes(Uriuri,StringmimeTypeFilter){returnnewString[0];}@OverridepublicPacMapcall(Stringmethod,Stringarg,PacMapextras){returnnull;}@OverridepublicStringgetType(Uriuri){returnnull;}}9.3.1案例:訪問文件19在config.json文件中設(shè)置文件讀、寫權(quán)限,其內(nèi)容如下:"reqPermissions":[ { "name":"com.example.dataabilityonfile.DataAbilityOnFile.DATA" }, { "name":"ohos.permission.READ_USER_STORAGE" }, { "name":"ohos.permission.WRITE_USER_STORAGE" }]修改MainAbilitySlice,其內(nèi)容如下:publicclassMainAbilitySliceextendsAbilitySlice{//定義日志標(biāo)簽
privatestaticfinalHiLogLabelLABEL_LOG=newHiLogLabel(HiLog.LOG_APP,0x00922,"MainAbilitySlice");9.3.1案例:訪問文件20 @Override publicvoidonStart(Intentintent){ super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); //找到組件
ButtonBtn_Visit=(Button)findComponentById(ResourceTable.Id_Btn_Visit); TextText_Result=(Text)findComponentById(ResourceTable.Id_Text_Result); //給Btn_Vist添加單擊事件
Btn_Visit.setClickedListener(component->{ Uriuri=Uri.parse("dataability://"+ "/com.example.dataabilityonfile.DataAbilityOnFile"+ "/test.txt"); //創(chuàng)建DataAbilityHelper輔助類對(duì)象
DataAbilityHelperdataAbilityHelper=DataAbilityHelper.creator(this);9.3.1案例:訪問文件21try{FileDescriptorfileDescriptor=dataAbilityHelper.openFile(uri,"r");//獲得BufferedReader對(duì)象
BufferedReaderbufferedReader=newBufferedReader(newFileReader(fileDescriptor));//獲取文本內(nèi)容
StringBuildercontent=newStringBuilder();Stringline;while((line=bufferedReader.readLine())!=null){ content.append(line);}bufferedReader.close();//關(guān)閉BufferedReader對(duì)象
//沙盒目錄
HiL(LABEL_LOG,"getDataDir:%{public}s.",getDataDir().toString());//沙盒文件目錄
HiL(LABEL_LOG,"getFilesDir:%{public}s.",getFilesDir().toString());9.3.1案例:訪問文件22打開遠(yuǎn)程模擬器,運(yùn)行程序,單擊應(yīng)用初始頁面中“訪問本地文件”按鈕,運(yùn)行結(jié)果如下圖所示9.3.1案例:訪問文件23控制臺(tái)輸出內(nèi)容如下: 06-0214:52:00.03318240-18240/com.example.dataabilityonfileI00922/DataAbilityOnFile:openFile()方法被調(diào)用 06-0214:52:00.03418240-18240/com.example.dataabilityonfileI00922/DataAbilityOnFile:createFile()方法被調(diào)用 06-0214:52:00.03818240-18240/com.example.dataabilityonfileI00922/MainAbilitySlice:getDataDir:/data/user/0/com.example.dataabilityonfile. 06-0214:52:00.03818240-18240/com.example.dataabilityonfileI00922/MainAbilitySlice:getFilesDir:/data/user/0/com.example.dataabilityonfile/files.9.3.2案例:訪問本地?cái)?shù)據(jù)庫24本節(jié)所使用的數(shù)據(jù)庫類型為關(guān)系型數(shù)據(jù)庫,是最為常見的數(shù)據(jù)庫類型之一,用于存儲(chǔ)結(jié)構(gòu)化型數(shù)據(jù)HarmonyOS提供的關(guān)系型數(shù)據(jù)庫功能更加完善,查詢效率更加高效。關(guān)系型數(shù)據(jù)庫基于關(guān)系模型來管理數(shù)據(jù)的數(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)目。如果不指定數(shù)據(jù)庫的日志模式,那么系統(tǒng)默認(rèn)日志方式是WAL(WriteAheadLog)模式。如果不指定數(shù)據(jù)庫的落盤模式,那么系統(tǒng)默認(rèn)落盤方式是FULL模式。HarmonyOS數(shù)據(jù)庫使用的共享內(nèi)存默認(rèn)大小是2MB。數(shù)據(jù)庫中連接池的最大數(shù)量是4個(gè),用以管理用戶的讀寫操作。為保證數(shù)據(jù)的準(zhǔn)確性,數(shù)據(jù)庫同一時(shí)間只能支持一個(gè)寫操作。9.3.2案例:訪問本地?cái)?shù)據(jù)庫25DatabaseHelper:是數(shù)據(jù)庫操作的輔助類,當(dāng)數(shù)據(jù)庫創(chuàng)建成功后,數(shù)據(jù)庫文件將存儲(chǔ)在由上下文指定的目錄里。數(shù)據(jù)庫文件存儲(chǔ)的路徑會(huì)因指定不同的上下文存在差異。數(shù)據(jù)庫的創(chuàng)建和刪除都需要用到DatabaseHelper類。因?yàn)镈atabaseHelper并不是單例,所以在使用時(shí)需要實(shí)例化。示例代碼如下:DatabaseHelperdatabaseHelper=newDatabaseHelper(this);StoreConfig類可以對(duì)數(shù)據(jù)庫進(jìn)行配置,包括設(shè)置數(shù)據(jù)庫名、存儲(chǔ)模式、日志模式、同步模式,是否為只讀,及數(shù)據(jù)庫加密。這里只介紹設(shè)置數(shù)據(jù)庫名,其他全部取默認(rèn)模式,示例代碼如下://創(chuàng)建數(shù)據(jù)庫配置對(duì)象,設(shè)置數(shù)據(jù)庫名StoreConfigconfig=StoreConfig.newDefaultConfig(“User.db”);9.3.2案例:訪問本地?cái)?shù)據(jù)庫26RdbOpenCallback類在數(shù)據(jù)庫創(chuàng)建時(shí)被回調(diào),開發(fā)者可以在該方法中初始化表結(jié)構(gòu),并添加一些應(yīng)用使用到的初始化數(shù)據(jù)。示例代碼如下://數(shù)據(jù)庫創(chuàng)建時(shí)被回調(diào)privatefinalRdbOpenCallbackrdbOpenCallback=newRdbOpenCallback(){
@OverridepublicvoidonCreate(RdbStorerdbStore){//創(chuàng)建表,如果表不存在rdbStore.executeSql("CREATETABLEIFNOTEXISTS"+表名+"("+ID+"INTEGERPRIMARYKEYAUTOINCREMENT,"+姓名+"TEXTNOWBULL,"+電話+"TEXT)");}
//數(shù)據(jù)庫升級(jí)時(shí)被回調(diào)@OverridepublicvoidonUpgrade(RdbStorerdbStore,inti,inti1){//在升級(jí)數(shù)據(jù)庫時(shí)使用該方法}};9.3.2案例:訪問本地?cái)?shù)據(jù)庫27下面介紹使用DataAbilityHelper訪問數(shù)據(jù)庫的具體步驟首先設(shè)計(jì)頁面UI,其需要有文本輸入組件、按鈕組件、文本組件。創(chuàng)建一個(gè)名為Const的類,用于存放在訪問數(shù)據(jù)庫過程中的各種常量。其內(nèi)容如下:publicclassConst{//URI協(xié)議publicstaticfinalStringSCHEME="dataability://";//URI授權(quán)publicstaticfinalStringAUTH="/com.example.addressbookdemo.UserDataAbility";//數(shù)據(jù)庫名publicstaticfinalStringDB_NAME="User.db";//表名publicstaticfinalStringDB_TAB_NAME="Users";//列名姓名publicstaticfinalStringDB_COLUMN_NAME="NAME";//列名電話publicstaticfinalStringDB_COLUMN_TEL="TEL";//列名IDpublicstaticfinalStringDATA_PATH="/Users";}9.3.2案例:訪問本地?cái)?shù)據(jù)庫28創(chuàng)建一個(gè)名為UserDataAbility的Data,修改其內(nèi)容如下:publicclassUserDataAbilityextendsAbility{//定義日志標(biāo)簽
privatestaticfinalHiLogLabelLABEL_LOG=newHiLogLabel(HiLog.LOG_APP,0x00922,"UserDataAbility");//創(chuàng)建關(guān)系型數(shù)據(jù)庫操作對(duì)象
privateRdbStorerdbStore;//創(chuàng)建數(shù)據(jù)庫操作的輔助類對(duì)象
privateDatabaseHelperdatabaseHelper;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);HiL(LABEL_LOG,"onStart()方法被調(diào)用");//初始化數(shù)據(jù)庫
initDB();}9.3.2案例:訪問本地?cái)?shù)據(jù)庫29//初始化數(shù)據(jù)庫
privatevoidinitDB(){HiL(LABEL_LOG,"initDB()方法被調(diào)用");databaseHelper=newDatabaseHelper(this);//創(chuàng)建數(shù)據(jù)庫配置對(duì)象,設(shè)置數(shù)據(jù)庫名
StoreConfigconfig=StoreConfig.newDefaultConfig(Const.DB_NAME);//根據(jù)配置創(chuàng)建數(shù)據(jù)庫
rdbStore=databaseHelper.getRdbStore(config,1,rdbOpenCallback,null);}//數(shù)據(jù)庫創(chuàng)建時(shí)被回調(diào)
privatefinalRdbOpenCallbackrdbOpenCallback=newRdbOpenCallback(){9.3.2案例:訪問本地?cái)?shù)據(jù)庫30@OverridepublicvoidonCreate(RdbStorerdbStore){//創(chuàng)建表,如果表不存在
rdbStore.executeSql("CREATETABLEIFNOTEXISTS"+Const.DB_TAB_NAME+"("+Const.DB_COLUMN_ID+"INTEGERPRIMARYKEYAUTOINCREMENT,"+Const.DB_COLUMN_NAME+"TEXTNOWBULL,"+Const.DB_COLUMN_TEL+"TEXT)");}9.3.2案例:訪問本地?cái)?shù)據(jù)庫31@OverridepublicResultSetquery(Uriuri,String[]columns,DataAbilityPredicatespredicates){HiL(LABEL_LOG,"query()方法被調(diào)用");//從uri中獲得表名
StringtableName=uri.getLastPath();//判斷表名是否是usersif("Users".equals(tableName)){//根據(jù)參數(shù)創(chuàng)建查詢條件
RdbPredicatesrdbPredicates=DataAbilityUtils.createRdbPredicates(predicates,tableName);HiL(LABEL_LOG,"查詢成功!");//查詢,返回結(jié)果集
returnrdbStore.query(rdbPredicates,columns);}HiL(LABEL_LOG,"查詢失敗!");returnnull;}9.3.2案例:訪問本地?cái)?shù)據(jù)庫32@Overridepublicintinsert(Uriuri,ValuesBucketvalue){HiL(LABEL_LOG,"insert()方法被調(diào)用");//從uri中獲得表名
StringtableName=uri.getLastPath();intindex=0;//判斷表名是否是usersif("Users".equals(tableName)){//插入數(shù)據(jù)庫,成功后返回行IDindex=(int)rdbStore.insert(tableName,value);HiL(LABEL_LOG,"插入數(shù)據(jù)成功!數(shù)據(jù)所在行ID:%{public}d.",index);returnindex;}HiL(LABEL_LOG,"插入數(shù)據(jù)失敗!");//失敗返回-1returnindex;}9.3.2案例:訪問本地?cái)?shù)據(jù)庫33@Overridepublicintdelete(Uriuri,DataAbilityPredicatespredicates){HiL(LABEL_LOG,"delete()方法被調(diào)用");//從uri中獲得表名
StringtableName=uri.getLastPath();//根據(jù)參數(shù),構(gòu)建刪除條件
RdbPredicatesrdbPredicates=DataAbilityUtils.createRdbPredicates(predicates,tableName);HiL(LABEL_LOG,"刪除數(shù)據(jù)成功!");//刪除指定數(shù)據(jù),并返回
returnrdbStore.delete(rdbPredicates);}9.3.2案例:訪問本地?cái)?shù)據(jù)庫34@Overridepublicintupdate(Uriuri,ValuesBucketvalue,DataAbilityPredicatespredicates){HiL(LABEL_LOG,"update()方法被調(diào)用");//從uri中獲得表名
StringtableName=uri.getLastPath();//根據(jù)參數(shù),構(gòu)建更新條件
RdbPredicatesrdbPredicates=DataAbilityUtils.createRdbPredicates(predicates,tableName);HiL(LABEL_LOG,"更新數(shù)據(jù)成功!");//更新數(shù)據(jù),并返回
returnrdbStore.update(value,rdbPredicates);}}9.3.1案例:訪問文件35打開遠(yuǎn)程模擬器,運(yùn)行程序,輸入聯(lián)系人信息,運(yùn)行結(jié)果如圖所示9.3.1案例:訪問文件36新建兩個(gè)聯(lián)系人,再單擊查詢聯(lián)系人按鈕;修改聯(lián)系人信息,修改后單擊更新聯(lián)系人按鈕,這里輸入ID為2,則修改第二個(gè)聯(lián)系人的信息,再單擊查詢聯(lián)系人按鈕;將ID為2的聯(lián)系人信息修改為姓名:“李四”,電話:。單擊刪除聯(lián)系人按鈕,再單擊查詢聯(lián)系人按鈕,刪除第二個(gè)聯(lián)系人,結(jié)果分別如下圖所示。9.3.3案例:訪問遠(yuǎn)程數(shù)據(jù)庫37訪問遠(yuǎn)程數(shù)據(jù)庫與訪問本地?cái)?shù)據(jù)庫的流程是一致的,區(qū)別在于需要在URI中加入所訪問的設(shè)備ID。下面創(chuàng)建一個(gè)名為AddressBook_VistRemote的應(yīng)用來演示,推薦CompileSDK版本選擇6。"reqPermissions":[{"name":"ohos.permission.DISTRIBUTED_DATASYNC"}]訪問本地?cái)?shù)據(jù)庫時(shí)設(shè)備ID為空,但是在訪問遠(yuǎn)程Data時(shí)需要設(shè)備ID,以及允許不同設(shè)備間可以進(jìn)行數(shù)據(jù)交換權(quán)限,在config.json文件中請(qǐng)求權(quán)限如下:9.3.3案例:訪問遠(yuǎn)程數(shù)據(jù)庫38publicclassMainAbilityextendsAbility{privatestaticfinalintMY_PERMISSIONS_REQUEST_DISTRIBUTED_DATASYNC=1;@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setMainRoute(MainAbilitySlice.class.getName());if(verifySelfPermission("ohos.permission.DISTRIBUTED_DATASYNC")!=IBundleManager.PERMISSION_GRANTED){//應(yīng)用未被授予權(quán)限
if(canRequestPermission("ohos.permission.DISTRIBUTED_DATASYNC")){//是否可以申請(qǐng)彈框授權(quán)(首次申請(qǐng)或者用戶未選擇禁止且不再提示)requestPermissionsFromUser(newString[]{"ohos.permission.DISTRIBUTED_DATASYNC"},因?yàn)樵试S不同設(shè)備間的數(shù)據(jù)交換權(quán)限是敏感權(quán)限,需要用戶確定,所以需要進(jìn)行動(dòng)態(tài)申請(qǐng),在MainAbility中申請(qǐng)代碼如下:9.3.3案例:訪問遠(yuǎn)程數(shù)據(jù)庫39 MY_PERMISSIONS_REQUEST_DISTRIBUTED_DATASYNC);}else{//顯示應(yīng)用需要權(quán)限的理由,提示用戶進(jìn)入
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年中國泵閥站市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國木制傘柄市場(chǎng)調(diào)查研究報(bào)告
- 2025年度私人拖拉機(jī)租賃與保險(xiǎn)綜合服務(wù)合同3篇
- 2024至2030年振動(dòng)棒連接頭項(xiàng)目投資價(jià)值分析報(bào)告
- 2024至2030年戶外裝飾防腐木材項(xiàng)目投資價(jià)值分析報(bào)告
- 2024至2030年微機(jī)多元素分析儀項(xiàng)目投資價(jià)值分析報(bào)告
- 2025年度版海域租賃合同書樣本3篇
- 2024至2030年安全網(wǎng)絡(luò)存儲(chǔ)產(chǎn)品項(xiàng)目投資價(jià)值分析報(bào)告
- 2025至2031年中國狐貍皮袖口行業(yè)投資前景及策略咨詢研究報(bào)告
- 2024至2030年固定式液壓載貨電梯項(xiàng)目投資價(jià)值分析報(bào)告
- 《小學(xué)生良好書寫習(xí)慣培養(yǎng)的研究》中期報(bào)告
- 大學(xué)英語四級(jí)詞匯表(下載)
- 2025年四川成都市溫江區(qū)市場(chǎng)監(jiān)督管理局選聘編外專業(yè)技術(shù)人員20人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 手術(shù)室發(fā)生地震應(yīng)急預(yù)案演練
- 初中數(shù)學(xué)新課程標(biāo)準(zhǔn)(2024年版)
- 高職院校專業(yè)教師數(shù)字素養(yǎng)架構(gòu)與提升路徑
- 售后服務(wù)人員培訓(xùn)資料課件
- 2024-2030年中國薯?xiàng)l行業(yè)發(fā)展趨勢(shì)及投資盈利預(yù)測(cè)報(bào)告
- 生命智能學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 中華傳統(tǒng)文化之戲曲瑰寶學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 公路工程利用鋰渣技術(shù)規(guī)范 第一部分:路基工程-編制說明
評(píng)論
0/150
提交評(píng)論