原文來自:http://blog.csdn.net/zuolongsnail/article/details/6566317
ContentProvider(內(nèi)容提供者)是Android中的四大組件之一。主要用于對外共享數(shù)據(jù),也就是通過ContentProvider把應用中的數(shù)據(jù)共享給其他應用訪問,其他應用可以通過ContentProvider對指定應用中的數(shù)據(jù)進行操作。ContentProvider分為系統(tǒng)的和自定義的,系統(tǒng)的也就是例如聯(lián)系人,圖片等數(shù)據(jù)。
?
以下這段是Google Doc中對ContentProvider的大致概述。
內(nèi)容提供者將一些特定的應用程序數(shù)據(jù)供給其它應用程序使用。數(shù)據(jù)可以存儲于文件系統(tǒng)、SQLite數(shù)據(jù)庫或其它方式。內(nèi)容提供者繼承于ContentProvider 基類,為其它應用程序取用和存儲它管理的數(shù)據(jù)實現(xiàn)了一套標準方法。然而,應用程序并不直接調(diào)用這些方法,而是使用一個 ContentResolver 對象,調(diào)用它的方法作為替代。ContentResolver可以與任意內(nèi)容提供者進行會話,與其合作來對所有相關交互通訊進行管理。
?
1.ContentProvider
Android提供了一些主要數(shù)據(jù)類型的ContentProvider,比如音頻、視頻、圖片和私人通訊錄等。可在android.provider包下面找到一些Android提供的ContentProvider。通過獲得這些ContentProvider可以查詢它們包含的數(shù)據(jù),當然前提是已獲得適當?shù)淖x取權限。
主要方法:
public boolean?onCreate() 在創(chuàng)建ContentProvider時調(diào)用
public Cursor?query(Uri, String[], String, String[], String) 用于查詢指定Uri的ContentProvider,返回一個Cursor
public Uri?insert(Uri, ContentValues) 用于添加數(shù)據(jù)到指定Uri的ContentProvider中
public int?update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的數(shù)據(jù)
public int?delete(Uri, String, String[]) 用于從指定Uri的ContentProvider中刪除數(shù)據(jù)
public String?getType(Uri) 用于返回指定的Uri中的數(shù)據(jù)的MIME類型
*如果操作的數(shù)據(jù)屬于集合類型,那么MIME類型字符串應該以vnd.android.cursor.dir/開頭。
例如:要得到所有person記錄的Uri為content://contacts/person,那么返回的MIME類型字符串為"vnd.android.cursor.dir/person"。
*如果要操作的數(shù)據(jù)屬于非集合類型數(shù)據(jù),那么MIME類型字符串應該以vnd.android.cursor.item/開頭。
例如:要得到id為10的person記錄的Uri為content://contacts/person/10,那么返回的MIME類型字符串應為"vnd.android.cursor.item/person"。
?
2.ContentResolver
當外部應用需要對ContentProvider中的數(shù)據(jù)進行添加、刪除、修改和查詢操作時,可以使用ContentResolver類來完成,要獲取ContentResolver對象,可以使用Context提供的getContentResolver()方法。
[java]?view plaincopy
ContentResolver?cr?=?getContentResolver();?? ContentResolver提供的方法和ContentProvider提供的方法對應的有以下幾個方法。
public Uri?
insert(Uri uri, ContentValues values) 用于添加數(shù)據(jù)到指定Uri的ContentProvider中。
public int?
delete(Uri uri, String selection, String[] selectionArgs) 用于從指定Uri的ContentProvider中刪除數(shù)據(jù)。
public int?
update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于更新指定Uri的ContentProvider中的數(shù)據(jù)。
public Cursor?
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用于查詢指定Uri的ContentProvider。
?
3.Uri
Uri指定了將要操作的ContentProvider,其實可以把一個Uri看作是一個網(wǎng)址,我們把Uri分為三部分。
第一部分是"content://"。可以看作是網(wǎng)址中的"http://"。
第二部分是主機名或authority,用于唯一標識這個ContentProvider,外部應用需要根據(jù)這個標識來找到它。可以看作是網(wǎng)址中的主機名,比如"blog.csdn.net"。
第三部分是路徑名,用來表示將要操作的數(shù)據(jù)。可以看作網(wǎng)址中細分的內(nèi)容路徑。
?
下面是用ContentProvider讀取聯(lián)系人數(shù)據(jù),屬于系統(tǒng)數(shù)據(jù)。完整代碼下載:android_contentprovider_system.rar
注意:這里的聯(lián)系人操作有點亂,關鍵是我還不是很熟,SDK1.6和SDK2.1的聯(lián)系人操作很有很大不同,希望哪位大俠指點一下。
[java]?view plaincopy
? ? ? ? ?? public?class?MainActivity?extends?Activity?{?? ????private?EditText?nameET;?? ????private?EditText?numberET;?? ????private?Button?insertBtn;?? ????private?Button?deleteBtn;?? ????private?Button?queryBtn;?? ????private?ListView?contentView;?? ?? ????@Override?? ????public?void?onCreate(Bundle?savedInstanceState)?{?? ????????super.onCreate(savedInstanceState);?? ????????setContentView(R.layout.main);?? ????????nameET?=?(EditText)?findViewById(R.id.name);?? ????????numberET?=?(EditText)?findViewById(R.id.number);?? ????????insertBtn?=?(Button)?findViewById(R.id.insert);?? ????????deleteBtn?=?(Button)?findViewById(R.id.delete);?? ????????queryBtn?=?(Button)?findViewById(R.id.query);?? ?????????? ????????contentView?=?(ListView)?findViewById(R.id.content);?? ????????insertBtn.setOnClickListener(new?OperateOnClickListener());?? ????????deleteBtn.setOnClickListener(new?OperateOnClickListener());?? ????????queryBtn.setOnClickListener(new?OperateOnClickListener());?? ????}?? ?? ????class?OperateOnClickListener?implements?OnClickListener?{?? ????????@Override?? ????????public?void?onClick(View?v)?{?? ????????????String?name?=?nameET.getText().toString();?? ????????????String?number?=?numberET.getText().toString();?? ????????????Person?p?=?new?Person(name,?number);?? ????????????switch?(v.getId())?{?? ?????????????? ????????????case?R.id.insert:?? ????????????????insert(p);?? ????????????????view();?? ????????????????break;?? ?????????????? ????????????case?R.id.delete:?? ????????????????delete(name);?? ????????????????view();?? ????????????????break;?? ?????????????? ????????????case?R.id.query:?? ????????????????view();?? ????????????????break;?? ????????????}?? ????????}?? ????}?? ?? ?????? ????private?void?view()?{?? ????????Cursor?c?=?query("");?? ????????ListAdapter?listAdapter?=?new?SimpleCursorAdapter(this,?R.layout.list,?? ????????????????c,?new?String[]?{?People._ID,?People.NAME,?People.NUMBER?},?? ????????????????new?int[]?{?R.id.id,?R.id.name,?R.id.number?});?? ????????contentView.setAdapter(listAdapter);?? ????}?? ?? ?????? ????private?void?insert(Person?p)?{?? ?????????? ????????ContentResolver?cr?=?getContentResolver();?? ????????ContentValues?values?=?new?ContentValues();?? ????????values.put(People.NAME,?p.name);?? ?????????? ????????values.put(Contacts.People.STARRED,?1);?? ????????Uri?uri?=?Contacts.People.createPersonInMyContactsGroup(cr,?values);?? ?????????? ????????Uri?url?=?Uri.withAppendedPath(uri,?? ????????????????Contacts.People.Phones.CONTENT_DIRECTORY);?? ????????values.clear();?? ????????values.put(Contacts.Phones.TYPE,?Contacts.Phones.NUMBER);?? ????????values.put(Contacts.Phones.NUMBER,?p.number);?? ?????????? ????????cr.insert(url,?values);?? ????}?? ?? ?????? ????private?void?delete(String?name)?{?? ?????????? ????????ContentResolver?cr?=?getContentResolver();?? ????????Uri?url?=?Contacts.People.CONTENT_URI;?? ?????????? ????????String?where?=?People.NAME?+?"=?";?? ????????String[]?selectionArgs?=?{?name?};?? ????????cr.delete(url,?where,?selectionArgs);?? ????}?? ?? ?????? ????private?Cursor?query(String?name)?{?? ?????????? ????????ContentResolver?cr?=?getContentResolver();?? ????????Uri?uri?=?Contacts.People.CONTENT_URI;?? ?????????? ????????String[]?projection?=?{?People._ID,?People.NAME,?People.NUMBER?};?? ?????????? ????????String?selection?=?null;?? ????????String[]?selectionArgs?=?null;?? ????????if?(!"".equals(name))?{?? ????????????selection?=?People.NAME?+?"=?";?? ????????????selectionArgs?=?new?String[]?{?name?};?? ????????}?? ?????????? ????????String?sortOrder?=?Contacts.People._ID;?? ????????Cursor?c?=?cr.query(uri,?projection,?selection,?selectionArgs,?? ????????????????sortOrder);?? ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? ?????????? ????????return?c;?? ????}?? }?? 程序截圖:?
總結
以上是生活随笔為你收集整理的【Android】Android中ContentProvider组件详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。