一、Shared Preferences、文件存储、SQLite、其他网络存储的弊端
—— 都只是在单独的一个应用程序之中达到一个数据的共享。但是,比如读取系统的通讯录、媒体库等数据时会遇到问题和障碍。
——摘自慕课网www.imooc.com
二、如何实现ContentProvider?
1. 首先当然是要有现成的数据,自己的数据库(就是你要提供的内容)
2. 继承抽象类ContentProvider实现一系列针对于数据的增删查改等方法;
//比如你至实现增删,则外部访问只能使用增删的功能
public boolean onCreate()//在ContentProvider被创建后调用
public int delete(Uri uri,String selection,String[] selectionArgs)//根据Uri删除selection指定的条件所匹配的全部记录
public Uri insert(Uri uri,ContentValues values)//根据Uri插入Values对应的数据
public int update(Uri uri,ContentValues,String selection,String[] selectionArgs)//根据uri修改selection指定的条件所匹配的全部记录
public Cursor query(Uri uri,String[] projection,String selection, String[] selectionArgs,String sortOrder)//根据uri查询出selection指定的条件所匹配的全部记录,并且可以指定查询哪些列,以什么方式(order)排序
public String getType(Uri uri)//返回当前uri的MIME类型,如果该URI对应的数据可能包含多条记录,那么MIME类型字符串就是以vnd.android.dir/开头;如果该URI对应的数据只有一条,则该MIME类型字符串就是以vnd.android.cursor.item/开头
3. 需在AndroidMainfest.xml中完成对ContentProvider的注册
四、解析Uri的类——UriMatcher类
——UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
.uriMatcher.NO_MATCH 表示不匹配任何路径的返回码
——matcher.addURI("com.imooc.provider","music",int-code);
.往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 cr = getContentResolver();
Cursor c = cr.query(uri,projection,selection,selectionArgs,sortOrder);//uri-ContactsContract.Contacts.contacts.CONTENT_URI ; projection-查询哪些列 new String[]{ContactsContract.Contacts._ID,ContactsContract.Contacts.DISPLAY_NAME}
if(c!=null){
while(c.moveToNext()){
int id = c.getInt(c.getColumnIndex(ContactsContract.Contacts._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){
c1.getString(c1.getColumnIndex(Phone.NUMBER));//家庭电话
else if (type == Phone.TYPE_MOBILE){
}
}
}
c1.close();
}
//根据联系人的ID去查询联系人的邮箱地址
Cursor c2 = cr.query(ContactsContract.CommonDataKinds.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(Data.Type));
if(type ==Email.TYPE_WORK){
//工作邮箱
}
}
c2.close();
}
}
cr.close();
}
七、插入联系人
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
Uri uri = cr.insert(ContactsContract.RawContacts.CONTENT_URI,values);
long raw_contact_id =ContentUris.parseId(uri);
values.clear();
//插入人名
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,"13333333333");
values.put(Phone.MIMETYPE,Phone.CONTENT_ITEM_TYPE);
uri = cr.insert(Data.CONTENT_URI,values);
//需权限 WRITE_CONTACT READ_CONTACT
查询联系人
增加联系人
短信的读取
通话记录
多媒体 图片 视频 音频
。。。。。
自定义的ContentProvider一般用不上