如何理解ContentProvider?
数据ContentProvider<—–增,删,改,查(通过Uri访问)其他程序等等实现ContentProvider方法
1.继承抽象类ContentProvider实现一系列针对数据的增,删,改,查等方法;
2.需在AndroidMainfest.xml中完成对ContentProvider的注册
< provider
android:name=”com.imooc.MusicProvider”
android:authorities=”com.provider.music”>
< /provider>
注册authorities属性值时全局唯一的
创建一个类继承抽象类contentprovider
oncreat(在创建后被调用)
delete(根据uri删除selection指定的条件所匹配全部记录)
insert(根据uri插入values对应的数据)
update(根据uri修改selection指定的条件所匹配的全部记录)
query(更加uri查询出selection指定的条件所匹配的全部记录,并且可以指定查询哪些列以什么方式排序)
getType(返回当前uri的MIME类型,如果uri对应数据包括多条记录那么MIME类型字符串就是以vnd.android.dir/开头 如果只对应一条记录就是vnd.android.cursor.item/开头)
Uri是指通用资源标志符—–content://com.imooc.provider/music/#
content://—前缀表明数据受控于一个内容提供者.它从不修改,也就是schema
com.imooc.provider—是指在AndroidMainfest.xml中我们注册的provider中的authorities属性所对应的唯一的
/music—具体操作于哪个条目
/#—具体指定到哪个条目下的那条记录(#标识通配符)
UriMatcher类
UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
UriMatcher.NO_MATCH 表示不匹配任何路径的返回码
matcher.addURI(“com.imooc.provider”,”music”,1);
往UriMatcher类里面添加一个拼凑的Uri
UriMatcher为一个Uri的容器,容器里面包含着我们即将可能要操作的Uri
如果通过match()方法匹配成功就返回code值
matcher.match(uri)
受限与通过addURI()方法添加进来的Uri匹配
匹配成功则返回设置的code值,反之,返回一个UriMatcher.NO_MATCH常量(-1)
ContentResolver:
-使用ContentResolver操作ContentProvider中的数据:
当外部应用需要对ContentProvider中的数据进行添加,删除,修改和查询操作时,可以使用ContentResolver类来完成
使用Activity提供的getContentResolver()方法获取ContentResolver对象
ContentResolver类提供了与ContentProvider类相同签名的四个方法
/**查电话号码,需要先查出人名和对应的id,然后才能根据人的id把所有人的号码查出
来再得到一个游标对象进行处理(游标套游标),例子如下:下面的id就是联系人的id
,查询联系人的id是查询的联系人的那个表。而查询电话号码是另一个表了,但是通过
联系人id和联系人表连在一起的。*/
Cursor c1 = cr.query(Phone.CONTENT_URI, new String[] {Phone.NUMBER, Phone.TYPE}
,Phone.CONTACT_ID + "=" + id, null, null);
// 根据联系人ID查询出联系人的电话号码
if (c1 != null) {
while (c1.moveToNext()) {
int type = c1.getInt(c1.getColumnIndex(Phone.TYPE));
if (type == Phone.TYPE_HOME) {
Log.i("info","家庭电话:" + c1.getString(c1.getColumnIndex(Phone.NUMBER)));
} else if (type == Phone.TYPE_MOBILE) {
Log.i("info","手机:" + c1.getString(c1.getColumnIndex(Phone.NUMBER)));
}
}
c1.close();
}
DemoContentProvider I
/*
* 准备工作:
* ContentResolver cr 是关联 uri
* values 插入 uri
* 然后 ContentUris.parseId(uri)返回uri的id
*/
onCreate{
ContentResolver cr = getContentResolver();
Cursor c = cr.query(Contacts.CONTENT_URI, new String[]
{Contacts._ID,Contacts.DISPLAY_NAME}, null, null, null);
if(c!=null){
while(c.moveToNext()){
int id=c.getInt(c.getColumnIndex("_id"));
String name=c.getString(c.getColumnIndex("display_name"));
Log.i("TAG", "_id:"+id);
Log.i("TAG", "name:"+name);
Cursor c1=cr.query(Phone.CONTENT_URI
, new String[]{Phone.NUMBER,Phone.TYPE}
, Phone.CONTACT_ID+"="+id, null, null);
//根据联系人的ID查询联系人的电话号码
if(c1!=null){
while(c1.moveToNext()){
int type=c1.getInt(c1.getColumnIndex(Phone.TYPE));
String number=c1.getString(c1.getColumnIndex(Phone.NUMBER));
if(type==Phone.TYPE_HOME){
Log.i("TAG", "家庭电话:"+number);
}else if(type==Phone.TYPE_MOBILE){
Log.i("TAG", "手机号码:"+number);
}
}
c1.close();
}
DemoContentProvider I(下)
//根据联系人的ID查询联系人的邮箱地址
Cursor c2=cr.query(Email.CONTENT_URI, new String[]
{Email.DATA,Email.TYPE}, Email.CONTACT_ID+"="+id, null, null);
if(c2!=null){
while(c2.moveToNext()){
int type=c2.getInt(c2.getColumnIndex(Email.TYPE));
String data=c2.getString(c2.getColumnIndex(Email.DATA));
if(type==Email.TYPE_WORK){
Log.i("TAG", "工作邮箱:"+data);
}
}
c2.close();
}
网络权限
<uses-permission android:name="android.permission.READ_CONTACTS"></uses>
DemoContentProvider II
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ContentResolver cr = getContentResolver();
//向联系人中插入一行数据
ContentValues values=new ContentValues();
Uri uri = cr.insert(RawContacts.CONTENT_URI, values);
Long raw_contact_id = ContentUris.parseId(uri);
//插入人名
values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id);
values.put(StructuredName.DISPLAY_NAME, "慕课网");
values.put(StructuredName.MIMETYPE,
StructuredName.CONTENT_ITEM_TYPE);
uri=cr.insert(Data.CONTENT_URI, values);
//插入电话信息
values.clear();
values.put(Phone.RAW_CONTACT_ID, raw_contact_id);
values.put(Phone.NUMBER, "15555221010");
values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
uri=cr.insert(Data.CONTENT_URI, values);
}