本文轉載自:http://blog.csdn.net/conowen/article/details/7273142
1、Content Provider(内容提供者)簡介
從字面上的意思來看,Content Providers是内容提供者,也就是資料的提供者,而資料的來源可以是SQLite資料庫或者File存儲等等方式。為了實作各個應用程式之間的資料共享,可以把應用程式的私有資料封裝成ContentProviders,接着定義一個URI,向外提供統一的資料接口。其他的應用程式可以通過這個URI來通路指定的資料,然後實作各種操作,如添加(insert)、删除 (delete)、查詢(query)、修改(update)。而不用去操作應用程式的底層私有資料。一般來說底層的私有資料是基于SQLite建立的。
和其他app共享資料的大體過程:
為友善其它app與使用者的應用程式的ContentProvider通信,通常要自定義一個公共的Uri:CONTENT_URI,其它app通過這一Uri,與ContentProvider交流。需要注意的是,當使用者自己建立好ContentProvider之後,并不直接與之打交道,而是通過ContentResolver進行操作。
2、Content Provider的使用
2.1、利用ContentResolver方法管理content Provider
Android提供了ContentResolver(内容分解器),外界的程式可以通過ContentResolver的方法來管理ContentProvider提供的資料。
簡單來說,Resolver就是分解、管理 Provider的資料内容。在了解Resolver之前,應該知道URI。事實上可以這樣了解,URI就是一個位址,對應着Content Provider的資料内容(關于URI的更詳細部分,可參看文章最後)。
ContentResolver是通過URI來查詢ContentProvider,ContentResolver采用的是類似資料庫的操作(SQLite)來從Content providers中擷取資料。
ContentResolver的主要接口方法,如下:(來自android 官方文檔)
傳回值 | 函數聲明 |
final Uri | insert(Uri url, ContentValues values)Inserts a row into a table at the given URL. |
final int | delete(Uri url, String where, String[] selectionArgs)Deletes row(s) specified by a content URI. |
final Cursor | query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)Query the given URI, returning a Cursor over the result set. |
update(Uri uri, ContentValues values, String where, String[] selectionArgs)Update row(s) in a content URI. |
要擷取ContentResolver的話,可以調用getContentResolver ()方法,
a、例如下面示範query(查詢)方法:
由上表可知query方法傳回值為Cursor,代碼如下
[java]
view
plain
copy- ContentResolver cr = getContentResolver();
- Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
獲得cursor (遊标)
(也可以用.managedQuery()方法來擷取cursor,兩者參數一樣,差別是第二種方法可以管理Cursor的生命周期。
如Cursor cr = managedQuery(myPerson, null, null, null, null);)
那為什麼要擷取Cursor呢?因為通過query(查詢)而得到的資料,要通過Cursor的方法來讀取。(隻是讀取而已)
b、其他方法(注意傳回值)
同樣地,比如把android改名為apple。可調用ContenResolver.update()方法。
删除單個記錄,調用ContentResolver.delete()方法,在參數中,指定到具體行即可。
如果是删除多個記錄,調用ContentResolver.delete()方法,URI參數指定Content Provider即可,并帶一個類似SQL的WHERE子句條件。
2.2、如何把一個應用程式的資料共享出去。
a、建立自己的Content provider(需要繼承ContentProvider類)
b、如果這個應用程式的資料和已存在的Content provider資料結構是一緻的,在獲得該Content provider的“寫”權限之後,
把資料寫到已存在的Content provider中。
/********************************************附錄**********************************/
1、URI的簡介
通用資源标志符(Universal Resource Identifier, 簡稱"URI")。
Android上可用的每種資源 - 如圖像、視訊、通訊錄、短信等等都可以用URI來表示。
URI也包括URL和和URN(為了便于了解,下面對比兩者)
其中URL很容易了解,就是平常所說的網頁位址。
衆所周知,URL不僅可以辨別特定網站,也可以辨別這個網站某個特定網頁。
同樣地,URI不僅可以辨別特定Content Provider,還可以辨別這個應用程式的Content Provider中特定的資料庫表。
這兩者是類似的
關于三者更詳細的對比,可參考此文章
http://www.eoeandroid.com/thread-526-1-1.html
2、URI的組成部分
一個完整的URI一般由4部分組成:
将其分為A,B,C,D
- "content://conowen.szu.mycontenprovider/tablename/#" #表示資料id
A:通用字首"content://",用來說明一個Content Provider控制這些資料。
B:URI 的辨別,它定義了是哪個Content Provider提供這些資料。對于第三方應用程式,為了保證URI辨別的唯一性,它必須是一個完整的、小寫的 類名。
這個辨別在 元素的 authorities屬性中說明:一般是定義該ContentProvider的包.類的名稱 。
C:資料庫中表的名字(如通訊錄)
D:如果URI中包含表示需要擷取的記錄的ID;則就傳回該ID對應的資料,如果沒有ID,就表示傳回全部;(如讀取通訊錄時,有ID表示某個聯系人,沒有ID表示整個通訊錄)
Android系統提供了兩個用于操作Uri的工具類,分别為UriMatcher和ContentUris。
UriMatcher
UriMatcher 類主要用于比對Uri.
ContentUris
ContentUris 類用于擷取Uri路徑後面的ID部分