Android中contentProvider的用途
使用內容供應商共享數據
如果直接訪問磁盤文件(SDCard|File|SQLite數據庫|首選項),需要很多底層的交互細節,但該種方式,只使用url即可對應用程序進行訪問,并統一了數據訪問方式。
public?class?PersonContentProvider?extends?ContentProvider{
//在該生命周期中才能正確得到Content對象。
public?boolean?onCreate(){
//...
}
public?Uri?insert(Uri?uri,ContentValues?values);?
....
}?
<application?android:icon="@drawable/icon"
Android:label="@string/app_name">
<!--注冊供應商-->
<provider?android:name=".PersonContentProvider"
Android:authorities="cn.itcast.providers.personprovider"/>
</application>
URI:
Content://cn.itcast.provider.personprovider/person/10
Scheme?????????主機名或authority??????路徑??
Scheme:android規定,必須是content://
Authority:唯一標識該供應商。
path:代表操縱的數據。
將字符串轉換成Uri對象
Uri?uri?=?Uri.parse("content://xxxx/person/10");
UriMatcher:
使用該類,可以判斷Uri如何哪一種模式
//若不匹配,返回UriMather.NO_MATCH
UriMatcher?sMatcher?=?new?UriMatcher(UriMatcher.NO_MATCH);
//一次添加匹配的模式串,以及匹配后返回的數值
//${authority}???${path}
sMatcher.addURI("cn.itcast.contentprovider","person",1);
sMatcher.addURI("cn.itcast.contentprovider","person/#",2);
switch(sMatcher.match(Uri)){
case?1:
case?2:
.....
}
//獲取uri后邊ID部分的話,可以通過
Uri?uri?=?Uri.parse("content://cn.itcast.provider.personprovider/person");
Uri?resultUri?=?ContentUris.withAppendedId(uri,10);?//...person/10
Uri.parse("content://cn.itcast.provider.personprovider/person/10")
Long?personid?=?ContentUris.parseId(uri);
XxxContentProvider?extends?ContentProvider{
....
//該方法用于返回當前Url所代表數據的MIME類型,如果操作的數據屬于集合類型,
//那么MIME類型字符串應該以vnd.android.cursor.dir/開頭
//如:''vnd.android.cursor.dir/person"
//如果要操作的數據屬于非集合類型數據,那么MIME類型字符串應該以
//vnd.android.cursor.item/開頭
//如:vnd.android.cursor.item/person
public?String?getType(Uri?uri){..};?
}
使用內容解析器(ContentResolver):
ContentResolver?resolver?=?getContentResolver();
Uri?uri?=?Uri.parse("content://cn.itcast.provider.personprovider/person");
ContentValues?values?=?new?ContentValues();
values.put("name",?"itcast");
values.put("age",?25);
//插入
resolver.insert(uri,?values);
//查詢
resolver.query(uri,?null,?null,?null,?"personid?desc");
//更新
resolver.update(updateIdUri,?updateValues,?null,?null);
//刪除
resolver.delete(deleteIdUri,?null,?null);
監聽contentprovider的數據變化
//供應商中的crud方法完成后需要發出數據變更的通知,以通知那些感興趣的監聽者
XxxContentProvider?extends?ContentProvider{
public?long?insert(){
...
getContext().getContentResolver().notifyChange(uri,null);
}
}
內容解析器如若要對數據變更,需要使用ContentObserver對uri進行監聽,收到通知后,回調處理方法onChange();
context.getContentResolver().registerContentObserver(uri,true,new?MyContentObserver(new?Handler()));
class?MyContentObServer?extends?ContentObserer{
public?MyContentObServer(Handler?handler){
super(handler);
}
public?void?onChange(){...}
}
監聽用戶發送(接收)的短信
系統自帶的短信程序發送(或接收)短信時,會通過ContentProvider把短信保存進數據庫,并且
發出一個變更通知(notifyChange).使用ContentObserver對數據變化進行監聽,在用戶發送
短信時,就會被ContentObserver竊聽到短信.
//系統
Context.getContentResolver().notifyChange("content://sms",null);
//客戶端:
Context.getContentResolver().registerObserver(uri,false,new?
ContentObserver(new?Handler()){});
//?content://sms/outbox
//?content://sms/outbox
//?content://sms/outbox
Cursor?cursor?=?
getContentResolver().query(Uri.parse("content://sms/outbox"),null,?
cursor.getInt(cursor.getColumnIndex("_id")));
cursor.getString(cursor.getColumnIndex("address")));
cursor.getString(cursor.getColumnIndex("body")));
cursor.getLong(cursor.getColumnIndex("date")));
注:
??<uses-permission?android:name="android.permission.READ_SMS"?/>
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Android中contentProvider的用途的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蒙氏教育课程启示(蒙氏教育课程)
- 下一篇: 海阔天空的粤语歌词中文谐音翻译(海阔天空