




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第七章第七章 Android中的數據存儲中的數據存儲倚動軟件工廠實驗室倚動軟件工廠實驗室 主要內容主要內容主要內容主要內容概述概述 一個應用程序,經常需要與用戶進行交互,需要保存用戶的設置和用戶數據,這些都離不開數據的存儲。Android系統提供了以下五種主要的數據存儲方式。u文件存儲:文件存儲:以數據流的方式存儲數據;用于存取一些數據量較大的數據,可以是手機存儲器或外存儲器上的數據。 uSharedPreferences:以鍵值對的形式存儲簡單數據;用于保存一些簡單類型的數據,如用戶配置或參數信息。uSQLite數據庫:數據庫:以數據庫的方式存儲結構化數據;用于保存結構較為復雜的數據,SQL
2、ite是Android系統內置的一個輕量級的數據庫,沒有后臺進程,整個數據庫對應一個文件。概述概述uContentProvider:用于在應用程序間共享數據;是Android提供的一種將私有數據共享給其他應用程序的方式。u網絡存儲:網絡存儲:從網絡中讀取,傳送數據;可以通過網絡下載資源,或上傳資源。文件存取文件存取uAndroid系統基于Java語言,在Java語言中提供了一套完整的輸入輸出流操作體系,與文件有關的FileInputStream、FileOutputStream等,通過這些類可以方便的訪問磁盤上的文件。Android除了支持這些方式來訪問手機上的文件外,還提供了專門的輸入輸出A
3、PI,用于更有效的輸入、輸出操作。uAndroid手機中的文件有兩個存儲位置:內置存儲空間和外部SD卡,相應的存儲方式稍有不同。uAndroid中文件的讀取操作主要通過Context類來完成,該類提供了兩種方法來打開文件夾里的文件IO流。文件存取文件存取DiagramContext提供了如提供了如下兩個方法來打下兩個方法來打開本應用程序的開本應用程序的數據文件夾里的數據文件夾里的文件文件IO流。流。 FileInputStream openFileInput(String name):打開打開應用程序的數據文件夾下的應用程序的數據文件夾下的name文件對應輸入流。文件對應輸入流。 FileOu
4、tputStream openFileOutput(String name, int mode):打開應用程序的數據文件夾打開應用程序的數據文件夾下的下的name文件對應輸出流。文件對應輸出流。 第一參數用于指定文件名稱,不能包含路徑分隔符第一參數用于指定文件名稱,不能包含路徑分隔符“/” ,如,如果文件不存在,果文件不存在,Android 會自動創建它會自動創建它。 第二參數用于指定操作模式,有四種模式。第二參數用于指定操作模式,有四種模式。文件存取文件存取-四種操作模式四種操作模式uContext.MODE_PRIVATE=0:為默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該
5、模式下,寫入的內容會覆蓋原文件的內容,如果想把新寫入的內容追加到原文件中,可以使用Context.MODE_APPEND 。uContext.MODE_APPEND=32768:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件再寫入內容; uContext.MODE_WORLD_READABLE =1:表示當前文件可以被其他應用讀取;uContext.MODE_WORLD_WRITEABLE =2:表示當前文件可以被其他應用寫入。文件存取文件存取-四種操作模式四種操作模式如果希望文件被其他應用讀和寫,可以傳入如果希望文件被其他應用讀和寫,可以傳入:Context.MODE_WOR
6、LD_READABLE + Context.MODE_WORLD_WRITEABLE或者直接傳入數值或者直接傳入數值3也可以。這也可以。這4種模式除了種模式除了Context.MODE_APPEND外,其他都會覆蓋掉原文件的內外,其他都會覆蓋掉原文件的內容。容。 應用程序的數據文件默認保存在應用程序的數據文件默認保存在/data/data/files目錄下,文件的后綴名隨意。目錄下,文件的后綴名隨意。文件存取步驟文件存取步驟在手機上創建文件和向文件中追加內容的步驟如下:(1)調用openFileOutput()方法,傳入文件的名稱和操作的模式,該方法將返回一個文件輸出流;(2)調用write(
7、)方法,向這個文件輸出流中寫入內容;(3)調用close()方法,關閉文件輸出流。文件存取步驟文件存取步驟讀取手機文件的一般步驟如下:(1)調用openFileInput()方法,傳入需要讀取數據的文件名稱,該方法將返回一個文件輸入流;(2)調用read()方法讀取文件的內容;(3)調用close()方法,關閉文件輸入流。案例案例 單擊write按鈕,將第一個文本編輯框(writeText)的內容寫入到指定的文件中(content.txt),單擊read按鈕, 從指定的文件中(content.txt)讀取數據并顯示在第二個文本框(readText)上。【示例練習示例練習:codes07File
8、Test】問題與討論問題與討論 1、當我們手機上不存在該文件時,我們先寫后讀與先讀后寫有區別嗎?程序會不會出錯? (具體做法:把手機上的content.txt文件刪除,然后分別進行先寫后讀與先讀后寫操作,觀察效果)。 2、不同操作模式的區別,當我們多次執行寫入操作時, 文件里的內容是被覆蓋還是不斷的在文件末尾附加新數據?(具體做法:修改openFileOutput()方法的第二個參數)。SD卡文件存取卡文件存取 使用openFileOutput()方法保存文件,文件是存放在手機上,一般手機的存儲空間不是很大,存放些小文件還行,如果要存放視頻類的大文件,則不行。對于像視頻這樣的大文件,可以把它存
9、放在SDCard上。 SDCard是什么?可以把它看作是移動硬盤或移動硬盤或U U盤盤。 讀取SD卡上的文件和讀取手機上的文件類似,都是采用文件操作流的方式進行讀取,Android沒有提供單獨的SD卡文件操作類,直接使用Java中的文件操作即可。 在訪問SD卡之前,需要驗證手機的SD卡狀態,Android為我們提供了Environment類來完成這一操作。SD卡文件存取卡文件存取 在模擬器中使用SDCard,需要先創建一張SDCard卡(只是鏡像文件)。SDCard可以在Eclipse創建模擬器時隨同創建,也可以使用DOS命令進行創建,如下: 在Dos窗口中進入android SDK安裝路徑的
10、tools目錄,輸入以下命令創建一張容量為100M的SDCard,文件后綴名可以文件后綴名可以自取自取,建議使用.img:mksdcardmksdcard 100100M M d d:sdcard.img:sdcard.img 在模擬器中加載SD卡的命令為:emulator emulator avdavd avdnameavdname sdcardsdcard d:sdcard.imgd:SD卡文件存取卡文件存取讀、寫讀、寫SDSD卡上的文件步驟如下:卡上的文件步驟如下:1、調用EnvironmentEnvironment的的getExternalStorageStategetExternal
11、StorageState()()方法判斷手機上是否插入了SD卡,并且應用程序具有讀寫SD卡的權限。 Environment.getExternalStorageStateEnvironment.getExternalStorageState()()方法用于獲取SDCard的狀態,如果手機裝有SDCard,并且可以進行讀寫,那么方法返回的狀態等于Environment.MEDIA_MOUNTEDEnvironment.MEDIA_MOUNTED。2、調用Environment的getExternalStorageDirectorygetExternalStorageDirectory()()方法
12、來獲取外部存儲器,也就是SD卡的目錄。 3、使用FileInputStreamFileInputStream、FileOutputStreamFileOutputStream、FileReaderFileReader、FileWriterFileWriter讀、寫SD卡里的文件。SD卡文件存取卡文件存取文件讀取之前,應確認手機上已插入SD卡,對于模擬器來說,可以通過mksdcard命令來創建虛擬存儲卡;為了讀、寫SD卡上的數據,必須在應用程序的清單文件。(AndroidManifest.xml)中添加讀、寫添加讀、寫SD卡的權限卡的權限。【前例修改前例修改:FileWReTest】注意事項注意
13、事項注意:注意:例子中向文件寫入內容時,使用到了Java的RandomAccessFileRandomAccessFile類,該類支持隨機訪問文件內容,主要是通過seek方法來設定文件指針的位置,每次讀寫內容時,都是從該指針處開始進行讀取的,從而實現了隨機訪問文件內容的功能。該類還有一個特點,就是既可以讀,也可以寫,創建時需指定它的讀寫模式。而raf.seek(destFile.lengthraf.seek(destFile.length()()用于將文件的指針定位到文件的末尾,實現將新內容附加到文件的目的。如果沒有這句代碼,多次向文件中寫入內容時,后寫的內容會替換前面的內容。讀取操作時,采用
14、的是簡單的文件輸入輸出流,每次都是讀取整個文件內容。SD卡文件存取卡文件存取應用程序的數據文件保存在應用程序的數據文件保存在/mnt/sdcard目錄下。目錄下。SharedPreferences 通常應用程序都需要為用戶提供設置參數功能,對于軟件配置參數的保存,windows軟件一般會采用ini文件進行保存;在Java里,我們可以采用properties屬性文件或者xml文件進行保存。類似的,Android平臺為我們提供了SharePreferencesSharePreferences接口,來進行一些輕量級的存儲。 SharedPreferences是一個接口,應用程序使用該接口可以快速而高
15、效的以鍵值對的形式保存數據,非常類似于Bundle。信息以XMLXML文件文件的形式存儲在android設備上。 SharedPreferences SharedPreferences接口本身并沒有提供寫入數據的能力,而是通過SharedPreferences的內部接口Editor,SharedPreferencesSharedPreferences調用edit()edit()方法即可獲取它對應的Editor對象。 Shared Preferences本身是一個接口,不能直接實例化,只能通過Context提供的getSharedpreferences(String name, int mode
16、)方法來獲取SharedPreferences實例。第一個參數表示保存信息的文件名,不需要后綴,第二個參數表示訪問權限,有Context.MODE_PRIVATEContext.MODE_PRIVATE;Context.MODE_WORLD_READABLEContext.MODE_WORLD_READABLE ;Context.MODE_WORLD_WRITEABLEContext.MODE_WORLD_WRITEABLE以及MODE_MULTI_PROCESSMODE_MULTI_PROCESS 。 SharedPreferences SharedPreferences數據總是保存在 /d
17、ata/data/shared_prefs目錄下, SharedPreferences數據總是以XML格式保存。案例案例 該程序實現保存用戶登錄信息的功能,用戶第一次登錄時可設置是否記錄密碼和是否自動登錄。如果用戶勾選記住密碼復選框,則下次登錄時,會直接顯示用戶名和密碼,用戶只需單擊登錄即可。【示例代碼示例代碼:codes07SaveLoginInfo 】注意注意文本文本文本在在data/data文件夾下生成的目錄結構如下:文件夾下生成的目錄結構如下:123456zhangsanlogin.xml文件的內容文件的內容讀寫其它應用讀寫其它應用SharedPreferences getShared
18、Preferences(StringgetSharedPreferences(String name,intname,int mode) mode)方法中,第二個參數可設置該SharedPreferences是否可被其他應用程序讀寫,前提是創建該SharedPreferences的應用程序指定了相應的訪問權限。主要步驟如下:1、需要創建其他程序對應的Context。(Android系統是根據應用程序的包名來作為該程序的標識的)2、調用其他應用程序的Context的getSharedPreferences(String name,int mode)即可獲取相應的SharedPreferences
19、對象;3、如果需要向其他應用的SharedPreferences數據寫入數據,調用SharedPreferences的edit()方法獲取相應的Editor即可。【實例練習實例練習:ReadOtherSharedPreferences】SQLite數據庫存儲數據數據庫存儲數據 在Android平臺上,集成了一個嵌入式關系型數據庫SQLite,SQLite支持 NULL、INTEGER、REAL(浮點數字)、TEXT(字符串文本)和BLOB(二進制對象)數據類型,雖然它支持的類型只有五種,但實際上SQLite也接受varchar(n)可變、char(n)、decimal(p,s) 等數據類型,只
20、不過在運算或保存時會轉成對應的五種數據類型。 SQLite最大的特點是可以把各種類型的數據保存到任何字段中,而不用關心字段聲明的數據類型是什么。 但有一種情況例外:定義為定義為INTEGER PRIMARY KEY的字段的字段只能存儲只能存儲64位整數,位整數, 當向這種字段保存除整數以外的數據時,將當向這種字段保存除整數以外的數據時,將會產生錯誤。會產生錯誤。 SQLite數據庫存儲數據數據庫存儲數據 SQLite允許存入數據時忽略底層數據列的實際數據類型,因此SQLite在解析建表語句時,會忽略建表語句中跟在字段名后面的數據類型信息,如下面語句會忽略name字段的類型信息:create t
21、able create table person_tb(idperson_tb(id integer primary key integer primary key autoincrementautoincrement, , name varchar(20)name varchar(20)。 因此,在編寫建表語句時,我們可以省略數據列后面的類型聲明。常用的常用的SQL標準語句標準語句查詢語句:查詢語句:select * from 表名 where 條件子句 group by 分組字句 having . order by 排序子句 如:select * from person select na
22、me from person group by name having count(*)1 select * from Account limit 5 offset 3 插入語句插入語句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(傳智,3)更新語句:更新語句:update 表名 set 字段名=值 where 條件子句。如:update person set name=傳智 where id=10刪除語句:刪除語句:delete from 表名 where 條件子句。如:delete fro
23、m person where id=SQLite數據庫相關類數據庫相關類 Android系統為我們提供了一些操作和管理數據庫的相關類,常用的有SQLiteOpenHelper、SQLiteDataBase、Cursor,與數據庫相關類都在android.database.sqlite包和android.database包之下。 SQLiteOpenHelper是Android提供的管理數據的工具類,主要用于數據庫的創建、打開和版本更新。一般用法是創建SQLiteOpenHelper類的子類,并擴展它的onCreate()和onUpgrade()方法(這兩個方法是抽象的,必須擴展),有選擇性的擴
24、展它的onOpen()方法。 SQLiteOpenHelper類類SQLiteOpenHelper類的常用方法:SQLiteDatabase getReadableDatabase():以讀寫的方式打開SQLiteDatabase對象,該方法內部調用getWritableDatabase()方法;SQLiteDatabase getWritableDatabase ():以寫的方式打開SQLiteDatabase對象,一旦打開成功,將會緩存該數據庫對象;abstract void onCreate (SQLiteDatabase db):當數據庫第一次被創建的時候調用該方法;abstract
25、void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion):當數據庫需要更新的時候調用該方法;void onOpen(SQLiteDatabase db):當數據庫打開時調用該方法。SQLiteOpenHelper類類 當調用SQLiteOpenHelper類的getReadableDatabase()或 getWritableDatabase ()獲取SQLiteDatabase實例時,如果數據庫不存在,Android系統會自動生成一個數據庫,然后調用onCreate()方法,在onCreate()方法里可以生成數據庫
26、表結構及添加一些應用需要初始化的數據。SQLiteDatabase類類 SQLiteDatabase是Android提供的代表數據庫的類(底層就是一個數據庫文件),該類封裝了一些操作數據庫的API,使用該類可以完成對數據進行添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作。對SQLiteDatabase的學習,應該重點掌握execSQL()和rawQuery()方法。execSQL()方法可以執行insert、delete、update和create table之類有更新行為的SQL語句;而rawQuery()方法用于執行select語句。SQLi
27、teDatabase類類SQLiteDatabase類的常用方法:execSQL(String sql,Object bindArgs):執行帶占位符的SQL語句,如果sql語句中沒有占位符,則第二個參數可傳null;execSQL(String sql):執行SQL語句;rawQuery(String sql,String selectionArgs):執行帶占位符的SQL查詢。除了execSQL()和rawQuery()方法, SQLiteDatabase還專門提供了對應的:insert()、delete()、update()和query()方法。但這些方法都可由execSQL()和raw
28、Query()方法替代。SQLiteDatabase類類table表名相當于select語句from關鍵字后面的部分。如果是多表聯合查詢,可以用逗號將兩個表名分開columns要查詢出來的列名相當于select語句select關鍵字后面的部分selection查詢條件子句相當于select語句where關鍵字后面的部分,在條件子句允許使用占位符“?”limit指定偏移量和獲取的記錄數相當于select語句limit關鍵字后面的部分groupBy相當于select語句group by關鍵字后面的部分having相當于select語句having關鍵字后面的部分orderBy相當于select語句
29、order by關鍵字后面的部分selectionArgs對應于selection語句中占位符的值,值在數組中的位置與占位符在語句中的位置必須一致,否則就會有異常。例如:query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各參數的含義:Cursor接口接口 Cursor接口主要用于存放查詢記錄的接口,Cursor是結果集游標,用于對結果集進行隨機訪問,如果熟悉JDBC,可發現Cursor與JDBC中的ResultSet作用很相似,提供了如下方法來移動查詢結果的記錄指針。 Cursor
30、接口的常用方法:move(int offset):將記錄指針向上或向下移動指定的行數。offset為正數就向下移動,為負數就向上移動;moveToNext()方法可以將游標從當前記錄移動到下一記錄,如果已經移過了結果集的最后一條記錄,返回結果為false,否則為true;Cursor接口接口 Cursor接口的常用方法:moveToPrevious()方法用于將游標從當前記錄移動到上一記錄,如果已經移過了結果集的第一條記錄,返回值為false,否則為true ;moveToFirst()方法用于將游標移動到結果集的第一條記錄,如果結果集為空,返回值為false,否則為true ;moveToL
31、ast()方法用于將游標移動到結果集的最后一條記錄,如果結果集為空,返回值為false,否則為true。數據庫操作的一般步驟數據庫操作的一般步驟使用SQLiteDatabase進行數據庫操作的步驟如下:獲取SQLiteDatabase對象,它代表了與數據庫的連接;調用SQLiteDatabase的方法來執行SQL語句;操作SQL語句的執行結果;關閉SQLiteDatabase,回收資源。備忘錄案例 該程序實現備忘錄功能,用于記錄生活中的一些重要事情,并提供查詢功能,可按條件進行模糊查詢。可輸入主題、相關內容以及選擇時間 ,單擊添加按鈕時,會將相關數據寫入數據庫,單擊查詢按鈕時,會根據主題、內容
32、以及時間進行精確和模糊查詢。 【示例代碼示例代碼:codes07 Memento 】備忘錄案例 數據庫文件位于數據庫文件位于/data/data/你的程序的包名你的程序的包名/databases/中中,可通過DDMS工具將該文件夾下的數據庫導出來,然后下載具體的圖形化界面進行查看。關鍵代碼文本 Android為我們提供了一個相應的命令行工具查看SQLite數據庫。進入到數據庫所在目錄(你導出來的文件所放文件夾),sqlite3 數據庫名進入到該數據庫然后即可利用sql語句查找相關信息。 注意:注意:通過命令行查看數據庫內容時,中文在命令行上會顯示亂碼。 問題與討論問題與討論(Android系統
33、在調用SQLiteOpenHelper的getReadableDatabase()方法時會判斷系統中是否已存在數據庫,如果不存在,系統會創建數據庫文件,因此查找記錄時不會出錯,只不過查詢結果為空。但若我們在創建數據庫時,沒有指定表結構,添加或查詢時會出錯)1、數據庫的創建過程是怎么樣的?當不存在數據庫時,直接查找記錄會不會出錯?2、數據庫的后綴名有要求嗎?(后綴名可任意)ContentProvider共享數據共享數據 隨著我們手機上應用的增多,往往在不同的應用之間需要共享數據,比如現在有一個短信群發的應用,用戶需要選擇收件人,這時候就需要獲取聯系人應用的數據,然后從中選擇收件人即可。 對于應用
34、之間數據的共享,我們可以在一個應用中直接操作另一個應用所記錄的數據,比如前面所學的文件、SharedPreferences或數據庫等,但這不僅需要應用程序提供相應的權限,而且還必須知道應用程序中數據存儲的細節,不同應用程序記錄數據的方式差別也很大,不利于數據的交換。針對這種情況,Android提供了ContentProvider,它是不同應用程序間共享數據的標準API,統一了數據訪問方式。ContentProvider共享數據共享數據 ContentProvider以某種URI的形式對外提供數據,數據以類似數據庫中表的方式暴露,允許其他應用訪問或修改數據,其他應用程序使用ContentReso
35、lver根據URI去訪問操作指定的數據。 URI是通用資源標識符,即每個ContentProvider都有一個唯一標識的URI,其他應用程序的ContentResolver根據URI就知道具體解析的是哪個ContentProvider,然后調用相應的操作方法,而ContentResolver的方法內部實際上是調用該ContentProvider的對應方法,而ContentProvider方法內部是如何實現的,其他應用程序是不知道具體細節的。對于不同的數據的存儲方式,該方法內部的實現是不同的,而外部訪問方法都是一致的。ContentProvider共享數據共享數據 ContentProvider
36、也是Android四大組件之一,如果要開發自己的ContentProvider必須實現Android系統提供的ContentProvider基類,并且需要在AndroidManifest.xml文件中進行配置。1、繼承繼承ContentProvider并重寫增、刪、查、改等方法;2、在在AndroidManifest.xml使用對該ContentProvider進行配置配置。 注意:注意:authorities是必備屬性,如果沒有是必備屬性,如果沒有authorities屬性會報錯。屬性會報錯。ContentProvider常用方法upublic abstract boolean onCrea
37、te():該方法在ContentProvider創建后調用,當其他應用程序第一次訪問ContentProvider時,ContentProvider會被創建,并立即調用該方法;upublic abstract Cursor query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder):根據Uri查詢符合條件的全部記錄,其中projection是所需要獲取的數據列;upublic abstract int update(Uri uri, ContentValues value
38、s, String select, String selectArgs):根據Uri修改select條件所匹配的全部記錄;ContentProvider常用方法upublic abstract int delete(Uri uri, String selection, String selectionArgs):根據Uri刪除符合條件的全部記錄;upublic abstract Uri insert(Uri uri, ContentValues values):根據Uri插入values對應的數據,ContentValues類似于map,存放的是鍵值對;upublic abstract Str
39、ing getType(Uri uri):該方法返回當前Uri所代表的數據的MIME類型。如果該Uri對應的數據包含多條記錄,則MIME類型字符串應該以vnd.android.curor.dir/開頭,如果該Uri對應的數據只包含一條記錄,則MIME類型字符串應該以vnd.android.cursor.item/開頭。Uri組成 Uri代表了要操作的數據,Uri主要包含了兩部分信息: 1、需要操作的ContentProvider ; 2、對ContentProvider中的什么數據進行操作。 一個Uri由以下幾部分組成: ContentProvider(內容提供者)的scheme已經由Andr
40、oid所規定, scheme為:content:/ 主機名(或叫Authority)用于唯一標識這個ContentProvider,外部調用者可以根據這個標識來找到它。 路徑(path)可以用來表示我們要操作的數據,路徑的構建應根據業務而定,如下:u要操作要操作person表中表中id為為10的記錄,可以構建這樣的路徑的記錄,可以構建這樣的路徑:/person/10u要操作要操作person表中表中id為為10的記錄的的記錄的name字段,字段, person/10/nameu要操作要操作person表中的所有記錄,可以構建這樣的路徑表中的所有記錄,可以構建這樣的路徑:/personu要操作要
41、操作xxx表中的記錄,可以構建這樣的路徑表中的記錄,可以構建這樣的路徑:/xxx 當然要操作的數據不一定來自數據庫,也可以是文件、當然要操作的數據不一定來自數據庫,也可以是文件、xml或網絡等其他存儲方式或網絡等其他存儲方式Uri組成 如果要把一個字符串轉換成Uri,可以使用Uri類中的parse()方法,如下: Uri uri = Uri.parse(content:/vider.personprovider/person); 因為Uri代表了要操作的數據,所以我們經常需要解析Uri,并從Uri中獲取數據。Android系統提供了兩個用于操作Uri的工具類,分別為U
42、riMatcher 和ContentUris 。掌握它們的使用,會便于我們的開發工作。Uri操作常用類介紹-UUri操作常用類介紹-UriMatcher UriMatcher類用于匹配Uri,它的用法如下: 1、注冊所有需要匹配的Uri路徑:UriMatcherUriMatcher myUrimyUri= new = new UriMatcher(UriMatcher.NO_MATCHUriMatcher(UriMatcher.NO_MATCH););/創建UriMather對象,常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼,該常量值為-1.myUri.addURI(“
43、.providers.myprovidermyUri.addURI(“.providers.myprovider”, “person”, ”, “person”, 1);1);/添加需匹配的Uri,如果match()方法匹配content:/.providers.myprovider/person路徑,返回匹配碼為1myUri.addURI(“.providers.myprovidermyUri.addURI(“.providers.myprovider”, ”, “person/#”, 2);“person/#”, 2);/添加需匹配的Uri,#號為通配符,表示匹配任何ID的Uri,如果匹配
44、則返回2,/例如如果match()方法匹配content:/.providers.myprovider/person/230/路徑,返回匹配碼為Uri操作常用類介紹-UriMatcher 2、注冊完需要匹配的Uri后,就可以使用myUri.match(uri)方法對輸入的Uri進行匹配,如果匹配就返回匹配碼,匹配碼是調用addURI()方法傳入的第三個參數,假設匹配content:/ .providers.myprovider/person路徑,返回的匹配碼為1。 ContentUris類用于獲取Uri路徑后面的ID部分,它有兩個比較實用的方法: withAppendedId(uri, id)
45、用于為路徑加上ID部分: Uri uri = Uri.parse(content:/vider.personprovider/person) Uri resultUri = ContentUris.withAppendedId(uri, 10); /生成后的Uri為:content:/vider.personprovider/person/10 parseId(uri)方法用于從路徑中獲取ID部分: Uri uri = Uri.parse(content:/vider.personprovider/person/10
46、) long personid = ContentUris.parseId(uri);/獲取的結果為:10Uri操作常用類介紹-ContentU ContentProvider的作用是暴露可供操作的數據,其他應用程序主要通過ContentResolver來操作ContentProvider所暴露的數據,ContentResolver相當于我們的客戶端。 ContentResolver是一個抽象類,是不能直接實例化的,那么我們如何得到ContentResolver實例呢?Android中Context類提供了getContentResolver()方法用于獲取ContentResolver對象。
47、然后即可調用其增刪查改方法進行數據操作。 ContentResolver操作類介紹操作類介紹ContentResolver常用方法常用方法u query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder):查詢Uri對應的ContentProvider中符合條件的全部記錄,其中projection是所需要獲取的數據列;u update(Uri uri, ContentValues values, String select, String selectArgs):更新Uri對
48、應的ContentProvider中符合select條件所匹配的全部記錄;ContentResolver常用方法常用方法u delete(Uri uri, String selection, String selectionArgs):刪除Uri對應的ContentProvider中符合條件的全部記錄;u insert(Uri uri, ContentValues values):向Uri對應的ContentProvider中插入values對應的數據,ContentValues類似于map,存放的是鍵值對; 一般來說,ContentProvider是單例模式的,當多個應用程序通過Conten
49、tResolver來操作ContentProvider提供的數據時,ContentResolver調用的數據操作將會委托給同一個ContentProvider處理。使用ContentResolver操作數據的步驟步驟: 調用Activity的getContentResolver()獲取ContentResolver對象; 根據需要調用ContentResolver的insert()、delete()、update()和query()方法操作數據。ContentResolver操作類介紹操作類介紹 ContentProvider操作常用類介紹操作常用類介紹 ContentValues類類和 Ja
50、va中的Hashtable類比較相似,都是負責存儲一些鍵值對,但是它存儲的鍵值對當中的鍵是一個String類型,往往是數據庫的某一字段名,而值都是一些簡單的數據類型。當我們向數據庫中插入一條記錄時,可以將這條信息的各個字段值放入ContentValues,然后將該ContentValues直接插入數據庫。而不用拼接SQL語句或使用占位符一一賦值。案例案例文本調用系統聯系人調用系統聯系人ContentProvider 通過ContentResolver去操作系統的聯系人數據,將輸入的用戶名和手機號添加到聯系人應用中,單擊顯示所有聯系人號碼,能夠讀取所有的聯系人信息。【示例代碼示例代碼:codes07 AccessContacts】案例案例為備忘錄添加為備忘錄添加ContentProvider下面以一個具體的示例演示如何創建自己的ContentProvider,我們為備忘錄示例創建ContentProvider,使得其他應用程序可以訪問和修改它的數據 【示示例代碼例代
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CSBME 041-2021PET/CT肺癌檢查操作和應用
- T/CRIA 28001-2023輪胎理賠用術語及定義
- T/CRIA 11011-2024磨損輪胎相對抓著性能評價規范
- T/CPUMT 006-2022工業數據安全事件應急預案編制指南
- T/CPCPA 0001-2024留學中介機構服務評價
- T/CNIDA 002-2022核電廠放射性廢物干燥處理系統設計要求
- T/CNFMA B006-2019園林綠化機械以汽油機為動力的便攜式割灌機和割草機
- T/CNCA 031-2022露天煤礦自然災害承災體調查技術要求
- T/CHTS 20016-2021公路橋梁各向異性摩擦擺減隔震支座
- T/CECS 10231-2022綠色建材評價工程修復材料
- 人工智能通識教程 第2版 課件全套 周蘇 第1-15章 思考的工具- 人工智能發展
- 2024年河南住院醫師-河南住院醫師口腔科考試近5年真題集錦(頻考類試題)帶答案
- 2024小紅書影像賽道賺錢趨勢詳解
- 《液壓傳動與氣動技術》課后習題答案(大學期末復習資料)
- 2024年生態環境執法大練兵比武競賽理論考試題庫-上(單選題)
- 大學生網絡安全教育筑牢安全網絡防線課件
- DB11-T854-2023占道作業交通安全設施設置技術要求
- (高清版)WS∕T 389-2024 醫學X線檢查操作規程
- 運輸企業安全生產責任制制度
- 駐顏有術 知到智慧樹網課答案
- GB/T 8492-2024一般用途耐熱鋼及合金鑄件
評論
0/150
提交評論