通過(guò)之前的講解,對(duì)ContentProvider有了比較全面的理解。那么如何創(chuàng)建ContentProvider呢?一般情況下,程序開(kāi)發(fā)人員在創(chuàng)建自己的ContentProvider的過(guò)程可以分為以下三步。
(1)首先,繼承ContentProvider類,并覆蓋ContentProvider的抽6個(gè)抽象方法。新建立的類繼承ContentProvider后,需覆蓋的6個(gè)方法如下。
□ public boolean onCreate(),當(dāng)ContentProvider 生成時(shí)調(diào)用此方法,主要實(shí)現(xiàn)初始化底層數(shù)據(jù)集和建立數(shù)據(jù)鏈接等工作。
□ public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) ,此方法返回一個(gè)Cursor 對(duì)象作為查詢結(jié)果集。
□ public Uri insert(Uri uri, ContentValues initialValues),此方法負(fù)責(zé)往數(shù)據(jù)集當(dāng)中插入一列,并返回這一列的Uri。
□ public int delete(Uri uri, String where, String[] whereArgs),此方法負(fù)責(zé)刪除指定Uri 的數(shù)據(jù)。
□ public int update(Uri uri, ContentValues values, String where,String[] whereArgs) ,此方法負(fù)責(zé)更新指定Uri 的數(shù)據(jù)。
□ public String getType(Uri uri) ,返回所給Uri 的MIME 類型,如果Uri是單條數(shù)據(jù),則返回的MIME數(shù)據(jù)類型應(yīng)以vnd.android.cursor.item開(kāi)頭;如果Uri是多條數(shù)據(jù),則返回的MIME數(shù)據(jù)類型應(yīng)以vnd.android.cursor.dir/開(kāi)頭。
新建立的類繼承ContentProvider后,Eclipse會(huì)提示程序開(kāi)發(fā)人員需要覆蓋部分代碼,并自動(dòng)生成需要覆蓋的代碼框架。代碼清單7-48所示的代碼是Eclipse自動(dòng)生成的代碼框架。
代碼清單7-48 繼承ContentProvider后的代碼框架
import android.content.*;
import android.database.Cursor;
import android.net.Uri;
public class PeopleProvider extends ContentProvider{
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
return null;
}
@Override
public oolean onCreate() {
// TODO Auto-generated method stub
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
(2)聲明CONTENT_URI,實(shí)現(xiàn)UriMatcher。
在上一步中,知道在返回所給Uri 的MIME 類型即實(shí)現(xiàn)getType(Uri uri)時(shí),需通過(guò)Uri是單條數(shù)據(jù)還是多條數(shù)據(jù)來(lái)確認(rèn)其返回的MIME數(shù)據(jù)類型。在新構(gòu)造的ContentProvider類中,通過(guò)構(gòu)造一個(gè)UriMatcher,判斷Uri是單條數(shù)據(jù)還是多條數(shù)據(jù)。為了便于判斷和使用Uri,一般將Uri的授權(quán)者名稱和數(shù)據(jù)路徑等內(nèi)容聲明為靜態(tài)常量,并聲明CONTENT_Uri。
聲明CONTENT_Uri和構(gòu)造UriMatcher的代碼如代碼清單7-49所示。
代碼清單7-49 聲明CONTENT_URI和構(gòu)造UriMatcher
//聲明了Uri的授權(quán)者名稱
public static final String AUTHORITY = "cn.com.farsight.peopleprovider";
//聲明了單條數(shù)據(jù)的數(shù)據(jù)路徑
public static final String PATH_SINGLE = "people/#";
//聲明了多條數(shù)據(jù)的數(shù)據(jù)路徑
public static final String PATH_MULTIPLE = "people";
//聲明了CONTENT_URI的字符串形式
public static final String CONTENT_URI_STRING = "content://" +
AUTHORITY + "/" + PATH_MULTIPLE;
//聲明了CONTENT_URI
public static final Uri CONTENT_URI = Uri.parse
(CONTENT_URI_STRING);
//聲明了多條數(shù)據(jù)的返回代碼
private static final int MULTIPLE_PEOPLE = 1;
//聲明了單條數(shù)據(jù)的返回代碼
private static final int SINGLE_PEOPLE = 2;
//聲明了UriMatcher
private static final UriMatcher uriMatcher;
//靜態(tài)構(gòu)造方法,聲明了UriMatcher的匹配方式和返回代碼
static {
// UriMatcher.NO_MATCH表示Uri無(wú)匹配時(shí)的返回代碼
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//addURI()方法用來(lái)添加新的匹配項(xiàng)
uriMatcher.addURI(AUTHORITY, PATH_SINGLE, MULTIPLE_PEOPLE);
uriMatcher.addURI(AUTHORITY, PATH_MULTIPLE, SINGLE_PEOPLE);
}
其中,addURI()方法用來(lái)添加新的匹配項(xiàng),語(yǔ)法如代碼清單7-50所示。
代碼清單7-50 addURI()方法語(yǔ)法
public void addURI (String authority, String path, int code)
其中,authority表示匹配的授權(quán)者名稱;path表示數(shù)據(jù)路徑,#可以代表任何數(shù)字;code表示返回代碼。
使用UriMatcher時(shí),則可以直接調(diào)用match()方法,對(duì)指定的Uri進(jìn)行判斷,示例代碼如代碼清單7-51所示。
代碼清單7-51 調(diào)用match()方法,對(duì)指定的URI進(jìn)行判斷
switch(uriMatcher.match(uri)){
case MULTIPLE_PEOPLE:
//多條數(shù)據(jù)的處理過(guò)程
break;
case SINGLE_PEOPLE:
//單條數(shù)據(jù)的處理過(guò)程
break;
default:
throw new IllegalArgumentException("不支持的URI:" + uri);
}
(3)注冊(cè)ContentProvider。
在完成ContentProvider類的代碼實(shí)現(xiàn)后,需要在AndroidManifest.xml文件中進(jìn)行注冊(cè)。注冊(cè)ContentProvider使用<provider>標(biāo)簽,例如,注冊(cè)了一個(gè)授權(quán)者名稱為cn.com.farsight.peopleprovider的ContentProvider,其實(shí)現(xiàn)類是PeopleProvider的示例代碼如代碼清單7-52所示。
代碼清單7-52 注冊(cè)ContentProvider
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<provider android:name =".PeopleProvider"
android:authorities ="cn.com.farsight.peopleprovider"/>
</application>