Android——组件之ContentProvider

一、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的注册

<provider
     android:name = "com.xxx.MusicProvider"
     android:authorities="com.provider.music">
</provider>
<!-- 注册的authorities属性值是全局唯一的 -->

三、什么是Uri?

    

四、解析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();
}

添加READ_CONTACTS权限

七、插入联系人

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

查询联系人

增加联系人

短信的读取

通话记录

多媒体  图片 视频  音频

。。。。。

自定义的ContentProvider一般用不上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章