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 =   www.aiwalls.com

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" />

作者:toto1297488504

發佈留言