內容提供者,
內容提供者
參考:
Android四大組件之內容提供者--ContentProvider - java小兵 - CSDN部落格
http://blog.csdn.net/wodewutai17quiet/article/details/46670597
Android四大組件之內容提供者--ContentProvider
B程式通過內容提供者來訪問連絡人程式的資料。
1,什麼是ContentProvider
ContentProvider將應用中的資料對其它應用進行共用, 提供增刪改查的方法
ContentProvider統一了資料的訪問方式,不必針對不同資料類型採取不同的存取原則
ContentProvider將資料封裝,只暴露出我們希望提供給其它程式的資料
ContentProvider中可以註冊觀察者, 監聽資料的變化
2,怎麼建立
2.1定義類繼承ContentProvider, 實現抽象方法,抽象方法中對資料庫操作的增刪改查都有。
2.2在資訊清單檔中註冊:在資訊清單檔的<application>節點下進行配置<provider>標籤,標籤中需要指定name和authorities屬性
name:完整的類名。可以省略包名(manifest節點的package值),注意:省略後的類名是以"."開頭的。
authorities:主機,是訪問Provider時的路徑,要唯一
B程式需要通過com.baidu這個url來實現訪問修改讀取連絡人程式。
完整類名就是繼承ContentProvider類的那個類的完整類名。
這樣配置也是告訴電腦,我這個類是內容提供者,後面要被別人訪問,並且可以通過com.baidu這個主機訪問我。
我們在B程式中通過內容解析者和主機名稱訪問連絡人程式。
3,在手機上註冊
將應用安裝到手機上即可, 不用運行程式
4,其它應用怎麼訪問
外部應用使用ContentResolver類對ContentProvider中的資料進行訪問(CRUD操作)
擷取解析器ContentResolver
ContentResolver resolver = Context.getContentResolver();
通過resolver.insert(), delete(), update(), query()方法訪問Uri關聯的ContentProvider
5,Uri的處理
URI代表要操作的資料,由scheme、authorites、path三部分組成
eg:
content://com.jxn.provider/person
scheme | authorites | path
1,schema:表明要訪問ContentProvider。固定為:"content://"
2,Authority(主機名稱或授權):定義了是哪個ContentProvider提供這些資料。
3,path:路徑,可根據商務邏輯自訂。eg: person、person/insert、person/insert/10等等
4,ID:通常定義URI時使用"#"號預留位置代替, 使用時替換成對應的數字
"content://com.jxn.provider/person/#" #表示資料id(#代表任一數字)
"content://com.jxn.provider/person/*" *來匹配任意文本
Android系統提供了兩個用於操作Uri的工具類:UriMatcher 和 ContentUris
1,UriMatcher類用於匹配Uri,用法如下:
第一步:把你需要匹配的Uri路徑全部給註冊上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.jxn.provider.personprovider/person路徑,返回匹配碼為1
matcher.addURI("com.jxn.provider.personprovider", "person", 1);//添加需要匹配uri,如果匹配就會返回匹配碼
//如果match()方法匹配content://com.jxn.provider.personprovider/person/230路徑,返回匹配碼為2
matcher.addURI("com.jxn.provider.personprovider", "person/#", 2);//#號為萬用字元
第二步:使用matcher.match(uri)方法對輸入的Uri進行匹配,如果匹配成功就返回匹配碼
switch (matcher.match(Uri.parse("content://com.jxn.provider.personprovider/person/10"))) {
case 1
// 相應的業務操作
break;
case 2
// 相應的業務操作
break;
default:
// 相應的業務操作
break;
}
2,ContentUris類用於為路徑加上ID和擷取路徑的ID
給Uri加上id: ContentUris.withAppendedId(uri, id)
擷取id: ContentUris.parseId(uri)
6,監聽內容提供者資料變化
1,如果ContentProvider的訪問者需要知道ContentProvider中的資料發生了變化,可以在ContentProvider 發生資料變化時調用getContentResolver().notifyChange(uri, null)來通知註冊在此URI上的訪問者,例如:
public class PersonContentProvider extends ContentProvider {
public Uri insert(Uri uri, ContentValues values) {
db.insert("person", "personid", values);
// 註:如果沒有調用notifyChange()方法,即使其它應用註冊了ContentObserver,也不會知道ContentProvider中的資料的變化
getContext().getContentResolver().notifyChange(uri, null);
}
}
2,如果ContentProvider的訪問者需要得到資料變化通知,必須使用ContentObserver對資料(用uri描述)進行監聽,當監聽到資料變化通知時,系統就會調用ContentObserver的onChange()方法:
getContentResolver().registerContentObserver(Uri.parse("content://com.jxn.providers.personprovider/person"),true, new PersonObserver(new Handler()));
public class PersonObserver extends ContentObserver{
public PersonObserver(Handler handler) {
super(handler);
}
public void onChange(boolean selfChange) {
//此處可以進行相應的業務處理
}
}
7,補充
getType()方法:主要用於匹配資料類型,返回當前Uri所代表資料的MIME類型。
如果返回資料是單條資料:vnd.android.cursor.item
如果返回資料是多條資料:vnd.android.cursor.dir