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一般用不上

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