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