您的位置:首页 > 移动开发 > Android开发

android之旅25 内容提供者与内容观察者

2016-01-07 23:57 573 查看
内容提供者用于提供外部访问自己不对外暴露的数据

清单文件的定义方式

<provider
android:name="packageName.PersonProvider"
android:authorities="anything.is.possible" --- 内容提供者的地址
android:exported="true">
</provider>


// 自定义内容提供者,访问自定义的数据
public class PersonProvider extends ContentProvider{
private MyOpenHelper oh;
private SQLiteDatabase db;
//NO_MATCH是下面啥都不匹配的时候返回值,值是-1
//UriMatcher用于提供给外部访问不同的数据内容
UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);
{
//传进来 content://anything.is.possible/person 返回1
um.addURI("anything.is.possible","person", 1);
//#代表任何数字,也就是匹配content://anything.is.possible/teacher/4
um.addURI("anything.is.possible","teacher/#", 1);
}
public boolean onCreate(){
oh = new MyOpenHelper(getContext());
db = oh.getWritableDatabase();
return false;
}
public Uri insert(Uri uri, ContentValues values){
//person是表名,values是其他应用组了以后传进来的
/* uri用于标识内容提供者,就是内容提供者的地址,
等同与在清单文件中部署的android:authorities字段*/
if (um.match(uri)==1){
db.insert("person", null, values);

//发送通知给内容观察者
//null表示可以指定一个观察者,类似广播里的最终接收者
ContentResolver cr  =
getContext().getContentResolver();
cr.notify(uri, null);

}else{
throw new IllegalArgumentException("err uri");
}
//获取#代表的参数值参数值通过ContentUris.parseId(uri)
return uri;
}
}


//其他人如何使用内容提供者
public void insert(View v){
ContentResolver cr = getContentResolver();//Activity里面有这个方法
ContentValues values = new ContentValues();
values.put("name", "xiaozhi");
values.put("money", "13000");//name、money是person表的项
//会根据uri找到对应的内容提供者,然后调用内容提供者的insert方法
// person就是路径里面带的数据
// content://anything.is.possible是标志
cr.insert(
uri.parse("content://anything.is.possible/person"),
values);
}


内容提供者实例1:短信获取

系统短信看表sms即可

TelephonyProvider是短信的内容提供者

public void click(View v){
ContentResolver cr = getContentResolver();
Cursor curosr = cr.query(uri.parse(content://sms), new
String[]{
"address", "date", "body", "type"
}, null, null, null);
while(cursor.moveToNext()){
String address = cursor.getString(0);
long date = cursor.getLong(1);
}
}


内容提供者实例2:系统联系人

系统联系人需要关注的表:raw_contacts(contacts_id)、data(每行是一个单独的信息,比如名字、号码、邮箱,都生成一个单独的条目data1,通过raw_contacts_id联系起来,mimetype_id该行信息属于什么类型)、mimetypes(mimetype_id对应的字符串)

public void click(View v){
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),new String[]{"contact_id"}, null, null, null);
while(cursor.moveToNext()){
String contactId = cursor.getString(0);
/*mimetype返回的不是data表里面的mimetype_id,
cr.query(
Uri.parse("content://com.android.contacts/data"),
null,
"raw_contact_id=?",
new String[]{contactId}, null);
}
}


内容观察者

protected void onCreate(Bundle b){
ContentResolver cr = getContentResolver();
cr.registerContentObserver(
Uri.parse("content://sms"),
/*
true表示以这个开头即可就有通知,比如content://sms/inbox
false表示精确匹配,比如这里必须是content://sms
*/
true,
new ContentObserver(new Handler()){
public void onChange(boolean selfChange){
super.onChange(selfChange);
//业务逻辑继续.....
}
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: