天天看點

【Android 學習】四大元件(三)——Content Provider

本文轉載自: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
  1. ContentResolver cr = getContentResolver();  
  2. 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

  1. "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部分