ContentProvider也是android的四大組件之一,與之前提到的Activity、Service一樣,使用ContentProvider也需要在AndroidManifest.xml檔案中進行配置。
java.lang.Object
|-- android.content.ContentProvider
同樣類似於Activity、Service,ContentProvider也一樣實現了ComponentCallbacks介面。
android平台提供了4種資料持久化方案,分別是檔案、Preference、資料庫(SQLite)和ContentProvider。那麼ContentProvider作為android四大組件之一與其它三種有什麼不同呢——ContentProvider儲存的資料允許應用程式之間共用。在android系統中,已經預置了幾種ContentProvider,向開發人員提供音頻、視頻、圖片、連絡人和通訊記錄等資料。很明顯,如果這些資料使用資料庫介面來儲存,那麼將無法提供給其它的應用程式使用。當然,如果資料只是想在應用程式內部使用,就不應該使用ContentProvider,而使用資料庫或檔案等可以獲得更高效的讀寫操作。
一旦某個程式通過ContentProvider暴露了自己的資料操作介面,那麼不管該應用程式是否啟動,其它應用程式都可以通過介面來操作該程式的內部資料,包括增加資料、刪除資料、修改資料和查詢資料等。ContentProvider是不同應用程式之間進行資料交換的標準API,ContentProvider以某種Uri的形式對外提供資料,允許其它應用程式訪問或修改資料,其它應用程式根據Uri去訪問操作指定資料。
既然有了ContentProvider,那麼我們如何訪問ContentProvider所提供的資料呢?android為開發人員提供了ContentResolver來操作資料。
Context提供了如下方法來擷取ContentResolver對象:getContentResolver(),一旦程式獲得ContentResolver對象之後,就可以調用ContentResolver的如下方法來操作資料:
insert(Uri uri,ContentValues values):向Uri對應的ContentProvider中插入values對應的資料
delete(Uri uri,String where,String[] selectionArgs):刪除Uri對應的ContentProvider中where提交匹配的資料
update(Uri uri,ContentValues values,String where,String[] selectionArgs):更新Uri對應的ContentProvider中where提交匹配的資料
query(Uri uri,String projection,String selection,String[] selectionArgs,String sortOrder):查詢Uri對應的ContentProvider中where提交匹配的資料
一般來說,ContentProvider是單一實例模式的,當多個應用程式通過ContentResolver來操作ContentProvider提供的資料時,ContentProvider調用的資料操作會委託給一個ContentProvider處理。
如果想使用ContentResolver處理系統預置的ContentProvider,那麼由以上的函數參數得知,我們有必要瞭解下android系統提供的各類ContentProvider的Uri:
android對連絡人管理ContentProvider的幾個Uri:
ContactsContract.Contacts.CONTENT_URI:管理連絡人的Uri
ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管理連絡人的電話的Uri
ContactsContract.CommonDataKinds.Email.CONTENT_URI:管理連絡人的郵件的Uri
android對多媒體管理ContentProvider的幾個Uri:
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI:儲存在外部儲存空間(SD卡)上的音頻檔案內容的ContentProvider的Uri
MediaStore.Audio.Media.INTERNAL_CONTENT_URI:儲存在手機內部儲存空間上的音頻檔案內容的ContentProvider的Uri
MediaStore.Images.Media.EXTERNAL_CONTENT_URI:儲存在外部儲存空間(SD卡)上的圖片檔案內容的ContentProvider的Uri
MediaStore.Images.Media.INTERNAL_CONTENT_URI:儲存在手機內部儲存空間上的圖片檔案內容的ContentProvider的Uri
MediaStore.Video.Media.EXTERNAL_CONTENT_URI:儲存在外部儲存空間(SD卡)上的視頻檔案內容的ContentProvider的Uri
MediaStore.Video.Media.INTERNAL_CONTENT_URI:儲存在手機內部儲存空間上的視頻件內容的ContentProvider的Uri
下面,我們通過一個讀取系統的多媒體儲存資訊的例子來示範如何使用系統提供的ContentProvider:
[java]
package nku.jerry.crazyit.crazyit_23;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.Menu;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends Activity
{
//記錄查詢到的資料
private Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//獲得ContentResolver執行個體
ContentResolver resolver=getContentResolver();
//從ContentProvider中獲得SD卡上的音樂列表
cursor=resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
String[] cols=new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.ARTIST};
int[] ids=new int[]{R.id.track_name,R.id.artist};
if(cursor!=null)
{
//添加代碼
}
SimpleCursorAdapter adapter=new SimpleCursorAdapter(this,R.layout.song_list,cursor,cols,ids);
//添加代碼
}
}