版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第6章內(nèi)容提供者和內(nèi)容觀察者《Android移動(dòng)開發(fā)基礎(chǔ)案例教程(第3版)》
熟悉內(nèi)容提供者的概述,能夠闡述內(nèi)容提供者的工作原理
掌握內(nèi)容提供者的使用方式,能夠使用內(nèi)容提供者訪問其他應(yīng)用程序的數(shù)據(jù)
掌握內(nèi)容提供者的創(chuàng)建方式,能夠獨(dú)立創(chuàng)建內(nèi)容提供者學(xué)習(xí)目標(biāo)/Target
掌握內(nèi)容觀察者的使用方式,能夠使用內(nèi)容觀察者觀察其他程序的數(shù)據(jù)變化章節(jié)概述/Summary在第5章介紹了Android數(shù)據(jù)持久化技術(shù),應(yīng)用這些持久化技術(shù)所保存的數(shù)據(jù)都只能在當(dāng)前應(yīng)用程序中訪問。但在Android開發(fā)中,有時(shí)也會(huì)訪問其他應(yīng)用程序的數(shù)據(jù)。為了實(shí)現(xiàn)這種跨程序共享數(shù)據(jù)的功能,Android提供了一個(gè)組件ContentProvider(內(nèi)容提供者)。為了觀察程序中數(shù)據(jù)的變化,Android提供了一個(gè)組件ContentObserver(內(nèi)容觀察者),本章將針對ContentProvider和ContentObserver進(jìn)行詳細(xì)講解。目錄/Contents010203ContentProvider概述創(chuàng)建ContentProvider訪問其他應(yīng)用程序的數(shù)據(jù)04ContentObserverContentProvider概述6.1
先定一個(gè)小目標(biāo)!熟悉內(nèi)容提供者的概述,能夠闡述內(nèi)容提供者的工作原理6.1ContentProvider概述6.1ContentProvider概述在Android中,應(yīng)用程序之間是相互獨(dú)立的,分別運(yùn)行在自己的進(jìn)程中。若應(yīng)用程序之間需要共享數(shù)據(jù),則會(huì)用到ContentProvider。下面將對ContentProvider進(jìn)行詳細(xì)講解。6.1ContentProvider概述ContentProvider作為四大組件之一,為不同應(yīng)用間安全、可控的數(shù)據(jù)共享提供標(biāo)準(zhǔn)機(jī)制。ContentProvider作用:跨應(yīng)用數(shù)據(jù)共享:允許不同應(yīng)用程序之間安全地共享數(shù)據(jù)。數(shù)據(jù)權(quán)限控制:可選擇共享部分?jǐn)?shù)據(jù),保護(hù)隱私數(shù)據(jù)不被泄露。統(tǒng)一訪問接口:提供標(biāo)準(zhǔn)的增刪改查API供其他應(yīng)用調(diào)用。6.1ContentProvider概述有兩個(gè)程序A和B,程序A使用ContentProvider暴露一部分?jǐn)?shù)據(jù)給外界。如果程序B要操作程序A暴露的數(shù)據(jù),則程序B需要通過ContentResolver類操作程序A暴露的數(shù)據(jù)。程序A也會(huì)通過ContentResolver類將操作結(jié)果返回給程序B。工作原理場景假設(shè)6.1ContentProvider概述ContentProvider使用基于數(shù)據(jù)模型的簡單表格來暴露需要共享的數(shù)據(jù),每一行表示一條記錄,而每一列表示具有特定類型和含義的數(shù)據(jù),并且其中每一條記錄都包含一個(gè)名為“_ID”的字段以標(biāo)識(shí)每條記錄。唯一標(biāo)識(shí),可以根據(jù)同一個(gè)ID查詢幾個(gè)相關(guān)表中的信息1.數(shù)據(jù)模型6.1ContentProvider概述ContentResolver中的增、刪、改、查方法要操作的數(shù)據(jù)源以URI的形式提供,URI為ContentProvider中的數(shù)據(jù)建立了唯一的標(biāo)識(shí)。URI組成部分:scheme、authority和path。2.URI要訪問的資源或數(shù)據(jù)的路徑由程序的包名作為ContentProvider的唯一標(biāo)識(shí)創(chuàng)建ContentProvider6.2
先定一個(gè)小目標(biāo)!掌握內(nèi)容提供者的創(chuàng)建方式,能夠獨(dú)立創(chuàng)建內(nèi)容提供者6.2創(chuàng)建ContentProvider6.2創(chuàng)建ContentProvider(1)創(chuàng)建一個(gè)繼承抽象類ContentProvider的類。(2)重寫該類中的onCreate()、insert()、delete()、update()、query()、getType()方法。創(chuàng)建ContentProvider的思路:6.2創(chuàng)建ContentProvideronCreate():初始化ContentProvider環(huán)境,如配置資源、啟動(dòng)服務(wù)等。insert():向指定URI插入數(shù)據(jù)。delete():刪除指定URI的數(shù)據(jù)。update():更新指定URI的數(shù)據(jù)。query():查詢指定URI的數(shù)據(jù)。getType():返回?cái)?shù)據(jù)的MIME類型。各個(gè)方法簡介:6.2創(chuàng)建ContentProvider(1)創(chuàng)建一個(gè)名為ContentProvider的應(yīng)用程序,指定包名為cn.itcast.contentprovider。(2)選中程序的包名,右擊選擇New”→“Other”→“ContentProvider”選項(xiàng)。(3)彈出一個(gè)對話框,在ClassName下方的輸入框中輸入ContentProvider的類名,在URIAuthorities下方的輸入框中輸入U(xiǎn)RI唯一標(biāo)識(shí),通常使用包名。(4)點(diǎn)擊“Finish”按鈕,,ContentProvider創(chuàng)建完成。創(chuàng)建ContentProvider的基本步驟:6.2創(chuàng)建ContentProviderMyContentProvider.java文件核心代碼publicintdelete(Uriuri,Stringselection,String[]selectionArgs){……}publicStringgetType(Uriuri){……}publicUriinsert(Uriuri,ContentValuesvalues){……}publicbooleanonCreate(){}publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder){……}publicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs){……}6.2創(chuàng)建ContentProviderContentProvider創(chuàng)建完成后,AndroidStudio會(huì)自動(dòng)在AndroidManifest.xml文件中對ContentProvider進(jìn)行注冊。<providerandroid:name=".MyContentProvider"android:authorities="cn.itcast.contentprovider"android:enabled="true"android:exported="true"></provider>AndroidManifest.xml文件核心代碼6.2創(chuàng)建ContentProvider屬性名稱說明示例值android:nameContentProvider類名.MyContentProviderandroid:authoritiesURI唯一標(biāo)識(shí)(通常為包名)cn.itcast.contentproviderandroid:enabled能否被系統(tǒng)實(shí)例化true或falseandroid:exported能否被其他應(yīng)用訪問true或false<provider>標(biāo)簽中的配置屬性說明6.2創(chuàng)建ContentProvider注意:每個(gè)應(yīng)用程序中創(chuàng)建的ContentProvider都必須在AndroidManifest.xml文件的<provider>標(biāo)簽中定義,否則系統(tǒng)將找不到需要運(yùn)行的ContentProvider。訪問其他應(yīng)用程序的數(shù)據(jù)6.3
先定一個(gè)小目標(biāo)!掌握內(nèi)容提供者的使用方式,能夠使用內(nèi)容提供者訪問其他應(yīng)用程序的數(shù)據(jù)6.3.1查詢其他程序的數(shù)據(jù)6.3.1查詢其他程序的數(shù)據(jù)ContentProvider在暴露數(shù)據(jù)的同時(shí),也提供了用于對數(shù)據(jù)進(jìn)行增、刪、改、查操作的方法。下面講解如何訪問其他應(yīng)用程序的數(shù)據(jù)。在不同應(yīng)用程序之間交換數(shù)據(jù)時(shí),應(yīng)用程序會(huì)通過ContentProvider暴露自己的數(shù)據(jù),并通過ContentResolver對程序暴露的數(shù)據(jù)進(jìn)行操作,ContentResolver充當(dāng)著一個(gè)“中介”的角色。因?yàn)樵谑褂肅ontentProvider暴露數(shù)據(jù)時(shí)提供了相應(yīng)操作的URI,所以在訪問現(xiàn)有的ContentProvider時(shí)先要指定相應(yīng)的URI,再通過ContentResolver來實(shí)現(xiàn)對數(shù)據(jù)的操作。6.3.1查詢其他程序的數(shù)據(jù)數(shù)據(jù)提供方:通過ContentProvider暴露數(shù)據(jù)并提供操作URI。數(shù)據(jù)使用方:通過ContentResolver作為“中介"操作數(shù)據(jù)。ContentProvider的作用:(1)通過parse()方法解析URI6.3.1查詢其他程序的數(shù)據(jù)Uriuri=Uri.parse("content://cn.itcast.mycontentprovider/person");(2)通過query()方法查詢數(shù)據(jù)//獲取ContentResolver對象,context為Context類的實(shí)例ContentResolverresolver=context.getContentResolver();Cursorcursor=resolver.query(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder);查詢數(shù)據(jù)的具體步驟如下:6.3.1查詢其他程序的數(shù)據(jù)query()方法包含5個(gè)參數(shù),具體如下。uri:表示查詢其他程序的數(shù)據(jù)時(shí)需要的URI。projection:表示要查詢的內(nèi)容,該內(nèi)容相當(dāng)于數(shù)據(jù)庫表中每列的名稱。selection:表示設(shè)置的查詢條件,相當(dāng)于SQL語句中的where,如果該參數(shù)傳遞的值為null,則表示沒有查詢條件。selectionArgs:該參數(shù)需要配合參數(shù)selection使用,如果參數(shù)selection中有“?”,則傳遞的參數(shù)selectionArgs會(huì)替換“?”,否則參數(shù)selectionArgs傳遞的值為null。sortOrder:表示查詢的數(shù)據(jù)按照什么順序進(jìn)行排序,相當(dāng)于SQL語句中的Orderby。如果該參數(shù)傳遞的值為null,則數(shù)據(jù)默認(rèn)是按照升序排序的。如果想要讓查詢的數(shù)據(jù)按照降序排序,則設(shè)置該參數(shù)傳遞的值為字符串“DESC”,注意,DESC前面需要添加一個(gè)空格,如果不加空格,最后轉(zhuǎn)換為SQL語句時(shí),Orderby與DESC會(huì)連在一起。(3)通過while循環(huán)語句遍歷查詢到的數(shù)據(jù)6.3.1查詢其他程序的數(shù)據(jù)while(cursor.moveToNext()){Stringaddress=cursor.getString(0); //參數(shù)0表示索引為0,即獲取第1個(gè)字段的值longdate=cursor.getLong(1); //參數(shù)1表示索引為1,即獲取第2個(gè)字段的值inttype=cursor.getInt(2); //參數(shù)2表示索引為2,即獲取第3個(gè)字段的值}cursor.close();//關(guān)閉Cursor通過query()方法查詢數(shù)據(jù)后,會(huì)將該數(shù)據(jù)存放在Cursor對象中,接著在while循環(huán)語句中調(diào)用Cursor類的moveToNext()方法遍歷Cursor對象,最后調(diào)用Cursor對象的close()方法來關(guān)閉Cursor以釋放資源。如果一個(gè)ContentProvider中含有多個(gè)數(shù)據(jù)源,就需要對不同的URI進(jìn)行匹配,此時(shí)可以用UriMatcher類對URI進(jìn)行匹配,匹配步驟如下。(1)初始化UriMatcher類UriMatchermatcher=newUriMatcher(UriMatcher.NO_MATCH);多學(xué)一招(2)注冊需要的URImatcher.addURI("cn.itcast.contentprovider","people",PEOPLE);matcher.addURI("cn.itcast.contentprovider","person/#",PERSON_ID);UriMatcher類(3)與已經(jīng)注冊的URI進(jìn)行匹配多學(xué)一招Uriuri=Uri.parse("content://cn.itcast.contentprovider/people");intmatch=matcher.match(uri);switch(match){casePEOPLE://匹配成功后做的相關(guān)操作
casePEOPLE_ID://匹配成功后做的相關(guān)操作
default:returnnull;}UriMatcher類
先定一個(gè)小目標(biāo)!掌握ContentResolver的使用,能夠獨(dú)立實(shí)現(xiàn)讀取手機(jī)通訊錄功能6.3.2實(shí)戰(zhàn)演練——讀取手機(jī)通訊錄下面通過一個(gè)讀取手機(jī)通訊錄的案例來演示如何使用ContentResolver操作Android設(shè)備的通訊錄中暴露的數(shù)據(jù)。6.3.2實(shí)戰(zhàn)演練——讀取手機(jī)通訊錄6.3.2實(shí)戰(zhàn)演練——讀取手機(jī)通訊錄通訊錄界面通訊錄列表?xiàng)l目界面創(chuàng)建程序。創(chuàng)建一個(gè)名為Contacts的應(yīng)用程序,指定包名為cn.itcast.contacts,指定第一個(gè)Activity的名稱為ContactActivity,布局文件名為activity_contact.xml。步驟1實(shí)現(xiàn)通訊錄功能步驟2放置界面控件。包括放置1個(gè)TextView控件、放置1個(gè)RecyclerView控件。步驟3刪除默認(rèn)標(biāo)題欄。修改theme屬性的值為“@style/Theme.AppCompat.NoActionBar”。步驟46.3.2實(shí)戰(zhàn)演練——讀取手機(jī)通訊錄添加androidx.recyclerview庫。將擁有RecyclerView控件的androidx.recyclerview庫添加到程序中。android:theme="@style/Theme.AppCompat.NoActionBar"搭建通訊錄列表?xiàng)l目界面布局。創(chuàng)建通訊錄列表?xiàng)l目界面。導(dǎo)入界面圖片。放置界面控件。創(chuàng)建通訊錄列表?xiàng)l目界面的背景文件tem_bg.xml。步驟56.3.2實(shí)戰(zhàn)演練——讀取手機(jī)通訊錄<?xmlversion="1.0"encoding="utf-8"?><shapexmlns:android="/apk/res/android"><solidandroid:color="#ffffff"/><cornersandroid:radius="8dp"/></shape>實(shí)現(xiàn)通訊錄功能封裝聯(lián)系人信息實(shí)體類。創(chuàng)建ContactInfo類,封裝聯(lián)系人信息的屬性。步驟66.3.2實(shí)戰(zhàn)演練——讀取手機(jī)通訊錄publicclassContactInfo{privateStringcontactName;//聯(lián)系人名稱
privateStringphoneNumber;//聯(lián)系人電話號碼
publicStringgetContactName(){returncontactName;}publicvoidsetContactName(StringcontactName){this.contactName=contactName;}
實(shí)現(xiàn)通訊錄功能6.3.2實(shí)戰(zhàn)演練——讀取手機(jī)通訊錄publicStringgetPhoneNumber(){returnphoneNumber;}publicvoidsetPhoneNumber(StringphoneNumber){this.phoneNumber=phoneNumber;}}步驟7編寫通訊錄列表的數(shù)據(jù)適配。首先創(chuàng)建一個(gè)通訊錄列表的數(shù)據(jù)適配器ContactAdapter,然后選中程序中的包c(diǎn)n.itcast.contacts,最后在該包中創(chuàng)建一個(gè)繼承RecyclerView.Adapter<ContactAdapter.MyViewHolder>類的ContactAdapter類,并重寫onCreateViewHolder()方法、onBindViewHolder()方法、getItemCount()方法。實(shí)現(xiàn)通訊錄功能實(shí)現(xiàn)顯示通訊錄界面數(shù)據(jù)的功能。包括申請讀取手機(jī)通訊錄的權(quán)限、將數(shù)據(jù)顯示到通訊錄界面上。步驟8步驟96.3.2實(shí)戰(zhàn)演練——讀取手機(jī)通訊錄<?xmlversion="1.0"encoding="utf-8"?><shapexmlns:android="/apk/res/android"><solidandroid:color="#ffffff"/><cornersandroid:radius="8dp"/></shape>添加讀取手機(jī)通訊錄的權(quán)限。在AndroidMainfest.xml文件中添加讀取手機(jī)通訊錄的權(quán)限。<uses-permissionandroid:name="android.permission.READ_CONTACTS"/>實(shí)現(xiàn)通訊錄功能6.3.2實(shí)戰(zhàn)演練——讀取手機(jī)通訊錄當(dāng)?shù)谝淮芜\(yùn)行Contacts程序時(shí),會(huì)出現(xiàn)左圖所示的界面,界面上會(huì)顯示一個(gè)對話框提示用戶是否允許讀取手機(jī)通訊錄,點(diǎn)擊對話框上的“Allow”表示允許讀取手機(jī)通訊錄,此時(shí)可以看到右圖所示的通訊錄界面;點(diǎn)擊對話框上的“Don’tallow”表示拒絕讀取手機(jī)通訊錄,此時(shí)獲取不到手機(jī)通訊錄數(shù)據(jù)。用戶需要自己在通訊錄中添加聯(lián)系人,如果通訊錄中沒有聯(lián)系人,則獲取結(jié)果為空ContentObserver6.4
先定一個(gè)小目標(biāo)!掌握內(nèi)容觀察者的使用方式,能夠使用內(nèi)容觀察者觀察其他程序的數(shù)據(jù)變化6.4.1ContentObserver概述6.4.1ContentObserver概述在學(xué)習(xí)ContentObserver之前,先來了解一個(gè)概念:消息中心。消息中心是Android系統(tǒng)內(nèi)部用于管理和分發(fā)數(shù)據(jù)變化的機(jī)制,可以理解為數(shù)據(jù)中轉(zhuǎn)中心,也叫作消息處理器。當(dāng)ContentProvider共享的數(shù)據(jù)發(fā)生變化時(shí),ContentProvider可以調(diào)用ContentResolver類中的notifyChange()方法向消息中心發(fā)送數(shù)據(jù)變化的通知。什么是消息中心?6.4.1ContentObserver概述工作機(jī)制如下:注冊監(jiān)聽:應(yīng)用通過registerContentObserver()方法,向系統(tǒng)注冊一個(gè)ContentObserver,指定要觀察的數(shù)據(jù)URI。變化通知:當(dāng)ContentProvider中的數(shù)據(jù)被修改(如增、刪、改)后,ContentProvider會(huì)調(diào)用notifyChange()方法發(fā)出通知?;卣{(diào)響應(yīng):消息中心將變化通知分發(fā)給所有注冊了該URI的ContentObserver,各觀察者會(huì)觸發(fā)其onChange()方法,應(yīng)用程序可在此方法中執(zhí)行更新UI等邏輯。ContentObserver是Android系統(tǒng)中實(shí)現(xiàn)數(shù)據(jù)變化監(jiān)聽的核心組件,其工作模型基于觀察者模式。應(yīng)用可借此監(jiān)聽由ContentProvider管理的、特定URI下的數(shù)據(jù)變更。6.4.1ContentObserver概述有3個(gè)程序A、B和C,程序A通過ContentProvider暴露數(shù)據(jù);程序B通過ContentResolver類操作程序A中的數(shù)據(jù);程序C觀察程序A中的數(shù)據(jù)是否發(fā)生變化。程序A、B、C之間的邏輯關(guān)系場景假設(shè)6.4.1ContentObserver概述使用ContentObserver觀察程序A的數(shù)據(jù)時(shí):首先要在程序A的ContentProvider中調(diào)用ContentResolver的notifyChange()方法。調(diào)用此方法后,當(dāng)程序B操作程序A中的數(shù)據(jù)時(shí),程序A會(huì)向消息中心發(fā)送數(shù)據(jù)變化的通知,此時(shí)程序C會(huì)觀察到消息中心的數(shù)據(jù)有變化,會(huì)觸發(fā)ContentObserver的onChange()方法。使用ContentObserver觀察數(shù)據(jù)變化的步驟:(1)創(chuàng)建ContentObserverpublicclassMyObserverextendsContentObserver{publicMyObserver(Handlerhandler){super(handler);}
@OverridepublicvoidonChange(booleanselfChange){super.onChange(selfChange);
}}當(dāng)MyObserver類觀察到URI代表的數(shù)據(jù)發(fā)生變化時(shí),程序會(huì)回調(diào)onChange()方法,并在該方法中處理相關(guān)邏輯6.4.1ContentObserver概述創(chuàng)建一個(gè)繼承ContentObserver類的MyObserver類,在該類中重寫父類的構(gòu)造方法與onChange()方法。(2)注冊ContentObserverContentResolverresolver=getContentResolver(); //獲取ContentResolver對象Uriuri=Uri.parse("content://aaa.bbb.ccc"); //獲取URIresolver.registerContentObserver(uri,true,newMyObserver(newHandler()));6.4.1ContentObserver概述注冊ContentObserver首先通過getContentResolver()方法獲取ContentResolver的對象resolver,接著通過該對象調(diào)用registerContentObserver()方法來注冊創(chuàng)建的ContentObserver。6.4.1ContentObserver概述registerContentObserver()方法包含3個(gè)參數(shù),具體如下。第1個(gè)參數(shù)表示ContentProvider的URI。第2個(gè)參數(shù)表示對提供的URI的匹配情況,當(dāng)該參數(shù)為true時(shí),表示可以匹配URI派生的其他URI;為false時(shí),表示只匹配當(dāng)前提供的URI。第3個(gè)參數(shù)表示創(chuàng)建的ContentProvider。(3)取消注冊ContentObserver@OverrideprotectedvoidonDestroy(){super.onDestroy();getContentResolver().unregisterContentObserver(newMyObserver(newHandler()));}6.4.1ContentObserver概述通過unregisterContentObserver()方法取消注冊。getContext().getContentResolver().notifyChange(uri,null);6.4.1ContentObserver概述在ContentObserver監(jiān)聽的ContentProvider中,重寫insert()方法、delete()方法、update()方法時(shí),程序都會(huì)調(diào)用ContentResolver的notifyChange()方法通知共享的數(shù)據(jù)變化了。注意事項(xiàng):notifyChange()方法包含2個(gè)參數(shù),具體如下。第1個(gè)參數(shù)表示URI。第2個(gè)參數(shù)表示表示ContentObserver,該參數(shù)設(shè)置為null,則表示ContentResolver會(huì)通知步驟2注冊的ContentObserver,該ContentProvider共享的數(shù)據(jù)發(fā)生了變化。
先定一個(gè)小目標(biāo)!掌握ContentObserver的使用,能夠獨(dú)立實(shí)現(xiàn)監(jiān)測數(shù)據(jù)變化功能6.4.2實(shí)戰(zhàn)演練——監(jiān)測數(shù)據(jù)變化下面通過監(jiān)測數(shù)據(jù)變化的案例來講解如何使用ContentObserver。6.4.2實(shí)戰(zhàn)演練——監(jiān)測數(shù)據(jù)變化操作數(shù)據(jù)庫界面6.4.2實(shí)戰(zhàn)演練——監(jiān)測數(shù)據(jù)變化創(chuàng)建程序。創(chuàng)建一個(gè)名為ContentObserverDB的程序,指定包名為cn.itcast.contentobserverdb。步驟1實(shí)現(xiàn)對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行操作的功能導(dǎo)入界面圖片。導(dǎo)入界面需要的圖片到drawable-hdpi文件夾中。步驟2放置界面控件。放置4個(gè)Button控件。步驟3創(chuàng)建數(shù)據(jù)庫及數(shù)據(jù)庫表。分別在PersonDBOpenHelper類中創(chuàng)建數(shù)據(jù)庫及數(shù)據(jù)庫表。步驟46.4.2實(shí)戰(zhàn)演練——監(jiān)測數(shù)據(jù)變化實(shí)現(xiàn)對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行操作的功能創(chuàng)建person.db數(shù)據(jù)庫的核心代碼。6.4.2實(shí)戰(zhàn)演練——監(jiān)測數(shù)據(jù)變化publicPersonDBOpenHelper(Contextcontext){super(context,"person.db",null,1);}創(chuàng)建info表的核心代碼@OverridepublicvoidonCreate(SQLiteDatabasedb){//創(chuàng)建該數(shù)據(jù)庫的同時(shí)新建一個(gè)info表,表中有_id和name這兩個(gè)字段
db.execSQL("createtableinfo(_idintegerprimarykeyautoincrement,namevarchar(20))");}6.4.2實(shí)戰(zhàn)演練——監(jiān)測數(shù)據(jù)變化實(shí)現(xiàn)對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行操作的功能創(chuàng)建ContentProvider。創(chuàng)建一個(gè)名為PersonProvider的ContentProvider。步驟5if(code==SUCCESS){
SQLiteDatabasedb=helper.getReadableDatabase();returndb.query("info",projection,selection,selectionArgs,null,null,sortOrder);}查詢數(shù)據(jù)核心代碼if(code==SUCCESS){SQLiteDatabasedb=helper.getReadableDatabase();longrowId=db.insert("info",null,values);}添加數(shù)據(jù)核心代碼6.4.2實(shí)戰(zhàn)演練——監(jiān)測數(shù)據(jù)變化實(shí)現(xiàn)對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行操作的功能if(code==SUCCESS){SQLiteDatabasedb=helper.getWritableDatabase();intcount=db.update("info",values,selection,selectionArgs);}更新數(shù)據(jù)核心代碼編寫界面交互代碼。在MainActivity中對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行增、刪、改、查的操作。步驟6操作數(shù)據(jù)庫的程序創(chuàng)建完成后,接下來創(chuàng)建監(jiān)測數(shù)據(jù)庫的程序。6.4.2實(shí)戰(zhàn)演練——監(jiān)測數(shù)據(jù)變化創(chuàng)建MonitorData程序。創(chuàng)建一個(gè)名為MonitorData的程序,指定包名為cn.itcast.monitordata。在MainActivity中注冊ContentObserver,監(jiān)測數(shù)據(jù)庫中的數(shù)據(jù)是否發(fā)生
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深度解析(2026)《GBT 26067-2010硅片切口尺寸測試方法》
- 深度解析(2026)《GBT 26012-2010電容器用鉭絲》
- 深度解析(2026)《GBT 25952-2010散裝浮選鎳精礦取樣、制樣方法》(2026年)深度解析
- 深度解析(2026)《GBT 25915.4-2010潔凈室及相關(guān)受控環(huán)境 第4部分:設(shè)計(jì)、建造、啟動(dòng)》
- 2025江蘇蘇州市公交集團(tuán)有限公司管理崗位(應(yīng)屆生)招聘7人模擬筆試試題及答案解析
- 2026廣東省氣象部門氣象類高校畢業(yè)生招聘5人(廣州專場)參考筆試題庫附答案解析
- 2025廣西國土規(guī)劃集團(tuán)西藏辦事處招聘備考考試題庫及答案解析
- 深度解析(2026)《GBT 25631-2010機(jī)械振動(dòng) 手持式和手導(dǎo)式機(jī)械 振動(dòng)評價(jià)規(guī)則》(2026年)深度解析
- 高中階段學(xué)校多樣化發(fā)展的制度瓶頸-基于《高中階段教育普及攻堅(jiān)計(jì)劃》后續(xù)評估
- 中船集團(tuán)第七〇八研究所2026屆校園招聘備考考試試題及答案解析
- 2025年沈陽華晨專用車有限公司公開招聘參考筆試題庫及答案解析
- 2025年河北石家莊市招聘工會(huì)社會(huì)工作人員25名筆試歷年題庫帶答案解析
- 亞洲投資銀行課件
- 2025年投融資崗位筆試試題及答案
- 烤房轉(zhuǎn)讓合同范本
- (一診)達(dá)州市2026屆高三第一次診斷性測試歷史試題(含答案)
- 《汽車網(wǎng)絡(luò)與新媒體營銷》期末考試復(fù)習(xí)題庫(附答案)
- 外一骨科年終總結(jié)
- 生產(chǎn)廠長年度工作總結(jié)
- 走遍天下書為伴侶課件
- 2025四川成都東部新區(qū)招聘編外工作人員29人筆試考試參考題庫及答案解析
評論
0/150
提交評論