- 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据暴露出去;
- 外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,可以读取程序的数据,也可以修改程序的数据。
3、 Uri:Uri是ContentResolver和ContentProvider进行数据交换的标识。
- 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据;
- ContentResolver 可以理解成是HttpClient的作用。
- 每个ContentProvider提供公共的URI来唯一标识其数据集。管理多个数据集的(多个表)的 ContentProvider 为每个数据集提供了单独的URI。
- Uri 的标准前缀:以“content://”作为前缀,这个是标准的前缀,表示该数据由 ContentProvider 管理。
- Uri 的authority部分:该部分是完整的类名。(使用小写形式)。
- Uri 的path部分(资源部分、数据部分): 用于决定哪类数据被请求。
- 被请求的特定记录的id值。如果请求不仅限于某个单条数据,该部分及其前面的斜线应该删除。
- 为了将一个字符串转换成Uri,Android中提供了Uri的parse()静态方法来实现。
- 首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
- URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
- URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。
- Uri insert(Uri uri, ContentValues values)
- int delete(Uri uri, String where, String[] whereArgs)
- Cursor query(Uri uri, String[] projection, String where, String[] whereArgs, String sortOrder)
- int update(Uri uri, ContentValues values, String where, String[] whereArgs)
- Uri CONTACTS_URI = ContactsContract.Contacts.CONTENT_URI;
- Uri PHONE_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
- Uri EMAIL_URI = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
public List<Map<String, Object>> getContactsList(){
List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();
Cursor cursor=contentResolver.query(contactUri, null, null, null, null);//查询raw_contacts表中的数据 _id display_name
while(cursor.moveToNext()){
Map<String, Object> map=new HashMap<String, Object>();
//获取联系人的id
int contactId=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
//获取联系人的名字
String display_name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
map.put(ContactsContract.Contacts._ID, contactId);
map.put(ContactsContract.Contacts.DISPLAY_NAME, display_name);
//根据当前联系人的id查询在data表中的电话的信息
Cursor phoneCursor=contentResolver.query(phoneUri, null,ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID+"=?",
new String[]{contactId+""}, null);
String phone="";
while(phoneCursor.moveToNext()){
//获取当前联系人的电话号码
phone=phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
System.out.println("------phone-----"+phone);
}
map.put("phone", phone);
//根据当前联系人的id查询data表中的邮箱的信息
Cursor emailCursor=contentResolver.query(emailUri, null,ContactsContract.CommonDataKinds.Email.RAW_CONTACT_ID+"=?",
new String[]{contactId+""}, null);
String email="";
while(emailCursor.moveToNext()){
//获取当前联系人的email信息
email=emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
}
map.put(ContactsContract.CommonDataKinds.Email.DATA, email);
list.add(map);
}
return list;
}
public void insertContact(){
//向raw_contacts插入空列数据 获取到唯一的id
ContentValues values=new ContentValues();
Uri newUri=contentResolver.insert(RawContacts.CONTENT_URI, values);
long contactId=ContentUris.parseId(newUri);//得到当前插入的联系人的id
//向data中插入名字数据
values=new ContentValues();
values.put(Data.RAW_CONTACT_ID, contactId);
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//标示当前data中存储的联系人姓名的数据
values.put(StructuredName.DISPLAY_NAME, "wangdabao");//向名称字段插入数据
contentResolver.insert(doUri, values);
//向data表中插入电话数据
values=new ContentValues();
values.put(Data.RAW_CONTACT_ID, contactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);//插入电话的类型
values.put(Phone.NUMBER, "010-54328190");//插入电话号码
contentResolver.insert(doUri, values);
//向data中插入邮箱数据
values=new ContentValues();
values.put(Data.RAW_CONTACT_ID, contactId);
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);//插入邮箱的类型
values.put(Email.DATA, "wangdb@qq.com");
contentResolver.insert(doUri, values);
}
(一)、Android系统管理联系人的Uri如下:
- ContactsContract.Contacts.CONTENT_URI 管理联系人的Uri
- ContactsContract.CommonDataKinds.Phone.CONTENT_URI 管理联系人的电话的Uri
- ContactsContract.CommonDataKinds.Email.CONTENT_URI 管理联系人的Email的Uri
- 联系人id字段名称为:ContactsContract.Contacts._ID
- 联系人name 字段为:ContactContract.Contracts.DISPLAY_NAME
- 电话信息表的外键id为:ContactsContract.CommonDataKinds.Phone.CONTACT_ID
- 电话号码 字段为:ContactsContract.CommonDataKinds.Phone.NUMBER.
- Email 字段为:ContactsContract.CommonDataKinds.Email.DATA
- 其外键为:ContactsContract.CommonDataKinds.Email.CONTACT_ID
(二)、Android为多媒体提供的ContentProvider的Uri如下:
- MediaStore.Audio.Media.EXTERNAL_CONTENT_URI 存储在SD卡上的音频文件
- MediaStore.Audio.Video.EXTERNAL_CONTENT_URI 存储在 SD卡上的视频
- MediaStore.Audio.Images.EXTERNAL_CONTENT_URI 存储在 SD卡上的图片文件内容
- MediaStore.Audio.Media.INTERNAL_CONTENT_URI 手机内部存储器上的音频文件
- MediaStore.Audio.Video.INTERNAL_CONTENT_URI 手机内部存储器上的视频
- MediaStore.Audio.Images.INTERNAL_CONTENT_URI 手机内部存储器上的图片
【数据库中主要字段:】
- 图片名称字段:Media.DISPLAY_NAME
- 图片的详细描述字段:Media.DESCRIPTION
- 图片的保存位置字段:Media.DATA
(三)、短信Uri:
- content://sms 所有短信
- content://sms/outbox 发送箱中的短信
- content://sms/inbox 收件箱中短信
- 短信手机号码 : address
- 短信标题: subject
- 短信内容:body
- 短信发送时间戳:date
- 短信类型:type
(四)、通话记录Uri:
- content://call_log/calls 所有通话记录