ContenProvider
增
删
改
查
通过Uri访问
如何实现ContenProvider?
1、继承抽象类ContenProvider实现一系列对于数据的增、删、改、查等方法;
2、需要在AndroidMainfest.xml中完成对ContenProvider的注册。
<provider
android:authorities="全局唯一的标识符"
android:name="类名"/>
注:authorities
---何为Uri?
Uri是指通用资源标识符
列:ABCD
A:content:// 表明数据受控一个类容提供者不修改
B: 一般为包名 唯一标识符(对应AndroidMainfest.xml文件中的 :authorities属性)
C: 具体操作与那个条目。
D: # 具体指定到那个条目下的那条记录(#表示通配符)
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)
增
删
改
查
通过Uri访问
如何实现ContenProvider?
1、继承抽象类ContenProvider实现一系列对于数据的增、删、改、查等方法;
2、需要在AndroidMainfest.xml中完成对ContenProvider的注册。
<provider
android:authorities="全局唯一的标识符"
android:name="类名"/>
注:authorities
---何为Uri?
Uri是指通用资源标识符
列:ABCD
A:content:// 表明数据受控一个类容提供者不修改
B: 一般为包名 唯一标识符(对应AndroidMainfest.xml文件中的 :authorities属性)
C: 具体操作与那个条目。
D: # 具体指定到那个条目下的那条记录(#表示通配符)
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类相同签名的四个方法
ContentResolver:
使用ContentResolver操作ContentProvider中弹数据:
-当外部应用需要对ContentProvider中的数据进行添加,删除、修改、和查询时,可以使用ContentResolver类来完成
-使用Activity提供的getContentResolver()方法获取ContentResolver对象
-ContentResolver类提供了与ContentProvider类相同签名的四个方法
常量:
ContactsContract.Contacts.CONTENT_URI——联系人的Uri
加权限:
加权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
______________________________________
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
______________________________________
先看一下ContenProvider的方法并没有实现任何功能:
/**你实现了什么方法别人就只能用你实现了的方法
* Created by Administrator on 2016/3/14 0014.
*/
public class MyContentProvider extends ContentProvider {
@Override
//创建时调用
public boolean onCreate() {
return false;
}
@Nullable
@Override
/** 根据uri查询selection匹配的记录,并却可以指定以(sortOrder)什么排序
* uri ContactsContract.Contacts.CONTENT_URI,联系人的Uri
* projection 查询的字段(列名)
* selection 根据什么(字段)查询
* selectionArgs 1
* sortOrder 指定以什么排序
*/
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return null;
}
@Nullable
@Override
//返回当前URi的MIMI类型,如果该URI对应的数据可能包括多条记录。那么MIMI类型字符串就是以vnd.android.dir/开头
//如果该URI对应的数据只有一条记录,该MIMI字符串就是以vnd.android.cursor.item/开头
public String getType(Uri uri) {
return null;
}
@Nullable
@Override
//根据uri插入values的数据;
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
//根据uri删除selection指定的记录
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
//根据uri修改selectionArgs指定的记录
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
}
联系人多查询和添加:
public void test(){
ContentResolver v =getContentResolver();
// ContactsContract.Contacts.CONTENT_URI,联系人的Uri
Cursor c=v.query(ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Contacts._ID}, null, null, null);
if (c!=null){
while (c.moveToNext()){
int id=c.getInt(c.getColumnIndex("_ID"));
Log.e("********", "id------->" + id);
//根据id查询电话号码
Cursor c1= v.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE},
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id,
null, null);
if (c1!=null){
while (c1.moveToNext()){
int type=c1.getInt(c1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
Log.e("********", " num------->" + c1.getString(c1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
c1.close();//一定要清理掉;
}
//根据id查询邮箱
Cursor c2=v.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
new String[]{ContactsContract.CommonDataKinds.Email.DATA, ContactsContract.CommonDataKinds.Email.TYPE}, ContactsContract.CommonDataKinds.Email._ID,null,null);
if (c2!=null){
while (c2.moveToNext()){
int email=c2.getInt(c2.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
Log.e("********", " email------->" +c2.getString(c2.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)));
}
c2.close();
}
}
c.close();//一定要清理掉;
}
}
public void testinsert(){
ContentResolver v=getContentResolver();
ContentValues values=new ContentValues();
//首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的raw_Contact_Id
Uri uri=v.insert(ContactsContract.RawContacts.CONTENT_URI, values);
long raw_contact_id= ContentUris.parseId(uri);
Log.e("********", "raw_contact_id------->" +raw_contact_id );
values.clear();
values.put(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID, raw_contact_id);
values.put(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, "啊啊啊");//名字:
values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
uri=v.insert(ContactsContract.Data.CONTENT_URI, values);
values.clear();
values.put(ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID,raw_contact_id);
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER,"13333333333");
values.put(ContactsContract.CommonDataKinds.Phone.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
uri=v.insert(ContactsContract.Data.CONTENT_URI,values);
}