1、使用ContentProvider 共享数据:
ContentProvider 类主要方法的作用如下:
* public boolean onCreate(); -该方法在ContentProvider 创建后就会被调用,Android开机后,ContentProvider
在其它应用第一次访问时才会被创建;
* public Uri insert(Uri uri,ContentValues values);
-该方法用于外部应用往ContentProvider添加数据;
* public int delete(Uri uri ,String selection,String[] selectionArgs);
-该方法用于外部应用从ContentProvider删除数据;
* public int update(Uri uri ,ContentValues values ,String selection,String[] selectionArgs);
-该方法用于外部应用更新ContenProvider数据;
* public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder);
-该方法用于外部应用从ContentProvider获取数据;
* public String getType(Uri uri);
-该方法用于返回当前Url 所代表数据的MIME类型,
1.2 public String getType(Uri uri);该方法的使用介绍:
该方法用于返回当前Url所代表数据的MIME类型。如果操作的数据属于集合类型,那么MIME类型字符串
应该以vnd.android.cursor.dir/开头;
例如:要得到所有person记录的 Uri为content://cn.itcast.provider.personprovider/person,那
么返回的MIME类型字符串应该为:vnd.android.cursor.dir/person。
如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头;
例如:得到id为10的person的记录,Uri为:content://cn.itcast.provider.personprovider/person/10,
那么返回的MIME类型字符串应该为:vnd.android.cursor.item/person;
2、使用ContentResolver操作ContentProvider中的数据:
* 工具类:ContentResolver
当外部的应用需要对ContentProvider中的数据进行添加、删除、修改和查询的操作时,可以使用ContentResolver类
来完成,要获取ContentResolver对象,可以使用Activity提供的getContentResolver()方法;ContentResolver提
供了与ContentProvider类相同签名的四个方法:
* public Uri insert(Uri uri,ContentValues values);
-往ContentProvider中添加数据;
* public int delete(Uri uri,String selection ,String[] selectionArgs);
-从ContentProvider中删除数据;
* public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs);
-更行ContentProvider中的数据;
* public Cursor query(Uri uri,String[] projectionm,String selection ,String[] selectionArgs,String sortOrder);
-该方法用于从Content中获取数据;
【注:以上所有方法的第一个参数Uri,代表要操作的ContentProvider和对其中的什么数据进行操作;】
例如:Uri.parse("content://cn.itcast.providers.personprovider/person/10");
表示:对主机名为:cn.itcast.providers.personprovider的ContentProvider进行操作,操作数据表person中id为
10的记录;
案例:模拟通讯录的操作:添加数据,删除,修改,查看;
使用小贴士:
首先:加入读写联系人信息的权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
需要使用到的Uri:
content://com.android.contacts/contacts 操作的数据是联系人的Uri;
content://com.android.contacts/data/phone 联系人电话Uri;
content://com.android.contacts/data/emails 联系人Email Uri;
注:表中不同的MIME,对应的Uri是不同的,如需获取对应类型的信息,那么Uri必须相对应;
具体实现代码:
ContentProvider 类主要方法的作用如下:
* public boolean onCreate(); -该方法在ContentProvider 创建后就会被调用,Android开机后,ContentProvider
在其它应用第一次访问时才会被创建;
* public Uri insert(Uri uri,ContentValues values);
-该方法用于外部应用往ContentProvider添加数据;
* public int delete(Uri uri ,String selection,String[] selectionArgs);
-该方法用于外部应用从ContentProvider删除数据;
* public int update(Uri uri ,ContentValues values ,String selection,String[] selectionArgs);
-该方法用于外部应用更新ContenProvider数据;
* public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder);
-该方法用于外部应用从ContentProvider获取数据;
* public String getType(Uri uri);
-该方法用于返回当前Url 所代表数据的MIME类型,
1.2 public String getType(Uri uri);该方法的使用介绍:
该方法用于返回当前Url所代表数据的MIME类型。如果操作的数据属于集合类型,那么MIME类型字符串
应该以vnd.android.cursor.dir/开头;
例如:要得到所有person记录的 Uri为content://cn.itcast.provider.personprovider/person,那
么返回的MIME类型字符串应该为:vnd.android.cursor.dir/person。
如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头;
例如:得到id为10的person的记录,Uri为:content://cn.itcast.provider.personprovider/person/10,
那么返回的MIME类型字符串应该为:vnd.android.cursor.item/person;
2、使用ContentResolver操作ContentProvider中的数据:
* 工具类:ContentResolver
当外部的应用需要对ContentProvider中的数据进行添加、删除、修改和查询的操作时,可以使用ContentResolver类
来完成,要获取ContentResolver对象,可以使用Activity提供的getContentResolver()方法;ContentResolver提
供了与ContentProvider类相同签名的四个方法:
* public Uri insert(Uri uri,ContentValues values);
-往ContentProvider中添加数据;
* public int delete(Uri uri,String selection ,String[] selectionArgs);
-从ContentProvider中删除数据;
* public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs);
-更行ContentProvider中的数据;
* public Cursor query(Uri uri,String[] projectionm,String selection ,String[] selectionArgs,String sortOrder);
-该方法用于从Content中获取数据;
【注:以上所有方法的第一个参数Uri,代表要操作的ContentProvider和对其中的什么数据进行操作;】
例如:Uri.parse("content://cn.itcast.providers.personprovider/person/10");
表示:对主机名为:cn.itcast.providers.personprovider的ContentProvider进行操作,操作数据表person中id为
10的记录;
案例:模拟通讯录的操作:添加数据,删除,修改,查看;
使用小贴士:
首先:加入读写联系人信息的权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
需要使用到的Uri:
content://com.android.contacts/contacts 操作的数据是联系人的Uri;
content://com.android.contacts/data/phone 联系人电话Uri;
content://com.android.contacts/data/emails 联系人Email Uri;
注:表中不同的MIME,对应的Uri是不同的,如需获取对应类型的信息,那么Uri必须相对应;
具体实现代码:
- package com.svse.contentprovider;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.ContactsContract;
- import android.provider.ContactsContract.CommonDataKinds.Email;
- import android.provider.ContactsContract.CommonDataKinds.Phone;
- import android.provider.ContactsContract.CommonDataKinds.StructuredName;
- import android.provider.ContactsContract.Data;
- import android.provider.ContactsContract.RawContacts;
- import android.app.Activity;
- import android.content.ContentResolver;
- import android.content.ContentUris;
- import android.content.ContentValues;
- import android.content.UriMatcher;
- import android.database.Cursor;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- private Button insert ,delete,update,read;
- protected void init(){
- insert = (Button) findViewById(R.id.insertContact);
- delete = (Button) findViewById(R.id.deleteContacts);
- update = (Button) findViewById(R.id.updateContacts);
- read = (Button) findViewById(R.id.readContact);
- }
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- /* 初始化组件对象 */
- init();
- /* 为read设置按钮点击事件监听器 */
- read.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- readContacts();
- }
- });
- insert.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- insertContacts();
- }
- });
- delete.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- deleteContacts();
- }
- });
- update.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //updateContacts();
- }
- });
- }
- /* 读取联系人信息 */
- public void readContacts(){
- /* 获取ContentResolver对象,使用getContentResolver()方法 */
- ContentResolver cr = this.getContentResolver();
- /**************************************联系人信息**********************************************/
- /* 执行查询操作,使用query();方法 */
- /* 参数说明:
- * @ uri : 操作ContentProvider的Uri;
- * @ projection :查询的列;
- * @ selecion :查询条件;
- * @ selectionArgs :条件对应参数;
- * @ sortOrder :排序方式;
- */
- /* 获取联系人信息: Uri:ContactsContract.Contacts.CONTENT_URI*/
- Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
- /* 操作游标,获取数据 */
- for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
- /* 保存当前联系人的所有信息 */
- StringBuffer sb = new StringBuffer();
- /* 获取联系人ID */
- String contactID = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
- sb.append("ID:"+contactID+"\n");
- /* 获取联系人姓名 */
- String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
- sb.append("姓名:"+name+"\n");
- /**********************************************************************************************/
- /* 通讯录 表 的特点:保存数据是按行保存,即:每个数据信息占一行,每行中该种属性能有多个值:
- * 例如 : 一个人的电话号码能有多个;即:一个contactID下有多个phone; */
- /**********************************************************************************************/
- /****************************获取电话号码*********************************************/
- //ContactsContract.CommonDataKinds.Phone.CONTENT_URI 获取Phone对应MIME类型的Uri;
- //ContactsContract.CommonDataKinds.Phone.CONTACT_ID 获取表中的联系人ID;
- Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"=?", new String[]{contactID}, null);
- while(phone.moveToNext()){
- String phoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
- sb.append("phone:"+phoneNumber+"\n");
- //Toast.makeText(MainActivity.this, "_ID="+contactID+" name="+name+" phone:"+phoneNumber, 1000).show();
- }
- /* 游标使用后要关闭 */
- phone.close();
- /**********************************************************************************************/
- /************************************获取Email*************************************************/
- Cursor email = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID+"=?", new String[]{contactID},null);
- while(email.moveToNext()){
- String emailAddress = email.getString(email.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
- sb.append("emailAddress:"+emailAddress+"\n");
- //Toast.makeText(MainActivity.this, "_ID="+contactID+" name="+name+" Email:"+emailAddress, 1000).show();
- }
- email.close();
- /**********************************************************************************************/
- Toast.makeText(MainActivity.this, sb.toString(), 1000).show();
- }
- cursor.close();
- }
- /* 添加联系人 */
- public void insertContacts(){
- /*************************************方式一*******************************************************/
- /* 首先:需要向RawContacts.CONTENT_URI 执行一个空值的插入,目的是获取系统返回的rawConatactId ,
- * 这是后面插入data表的依据,只有执行空值的插入,才能使插入的联系人在通讯录里可见*/
- ContentValues values = new ContentValues();
- /* 向 RawContacts.CONTENT_URI执行一个空值的插入,返回rawContactId */
- Uri rawContactUri = this.getContentResolver().insert(RawContacts.CONTENT_URI, values);
- /* 从Uri路径中获取 ID 的部分 */
- long rawContactId = ContentUris.parseId(rawContactUri);
- values.clear();
- /* data表中的数据结构特点:每个数据信息以行进行保存,所以每次添加一行数据 */
- /* 向data表中插入姓名 */
- values.put(Data.RAW_CONTACT_ID, rawContactId); //ID
- values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); //内容的类型
- values.put(StructuredName.GIVEN_NAME, "张三峰");
- this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
- values.clear();
- /* 向data表中插入移动电话 */
- values.put(Data.RAW_CONTACT_ID, rawContactId);
- values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
- values.put(Phone.NUMBER, "15337178625");
- values.put(Phone.TYPE, Phone.TYPE_MOBILE); //电话的类型:工作电话 移动电话 家庭电话
- this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
- values.clear();
- /* 向data表中插入工作电话 */
- values.put(Data.RAW_CONTACT_ID, rawContactId);
- values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
- values.put(Phone.NUMBER, "02787878989");
- values.put(Phone.TYPE, Phone.TYPE_WORK); //电话的类型:工作电话 移动电话 家庭电话
- this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
- values.clear();
- /* 向data表中添加Email */
- values.put(Data.RAW_CONTACT_ID, rawContactId);
- values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
- values.put(Email.DATA, "15337178625@qq.com");
- values.put(Email.TYPE, Email.TYPE_WORK); //电话的类型:工作电话 移动电话 家庭电话
- this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
- values.clear();
- Toast.makeText(MainActivity.this, "数据添加成功!", 1000).show();
- /********************************************************************************************************/
- /*********************************方式二:批量添加,处于同一个事务**************************************/
- }
- /* 删除 */
- public void deleteContacts(){
- /* 首先获取CotentResolver对象,用于操作ContentProvider */
- ContentResolver cr = this.getContentResolver();
- /* 思路:删除一个联系人的所有,则根据RAW_CONTACT_ID进行删除 */
- cr.delete(RawContacts.CONTENT_URI, RawContacts.CONTACT_ID+"=?", new String[]{"1"});
- Toast.makeText(MainActivity.this, "数据删除成功", 1000).show();
- }
- //
- // /* 修改 */
- // public void updateContacts(){
- // ContentResolver cr = this.getContentResolver();
- //
- // /* 获取ID,需要修改的联系人ID,然后确定修改信息 */
- // ContentValues values = new ContentValues();
- // values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//值的类型
- // values.put(StructuredName.GIVEN_NAME, "张无忌");
- // cr.update(ContactsContract.Contacts.CONTENT_URI, values, ContactsContract.Data.DISPLAY_NAME+"=?", new String[]{"张三峰"});
- // Toast.makeText(MainActivity.this, "修改成功", 1000).show();
- // readContacts();
- // }
- //
- /* UriMathcer 类的用法 */
- public void uriMatcher(){
- /* 常量UriMatche.NO_MATCH 标示部匹配任何路径的返回码 */
- UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- /* 如果match()方法匹配content://cn.itcast.provider.personprovider/person 路径,
- * 返回匹配码为 1
- */
- /* 添加需要匹配的URL ,如果匹配就会返回匹配码 */
- sMatcher.addURI("cn.itcast.provider.personprovider", "person", 1);
- /* # 为通配符 *//* match():方法匹配:content://cn.itcast.provider.personprovider/person/230
- * 路径, 返回匹配码2
- * */
- sMatcher.addURI("cn.itcast.provider.personprovider", "person/#", 2);
- /* 按上述添加的规则进行匹配,不同的路径匹配返回不同的匹配码 */
- int code = sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"));
- /**********************************************************************/
- //ContentUris 的介绍
- /* 将字符串转换成Uri */
- Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");
- /* 为路径添加ID部分 */
- Uri resultUri = ContentUris.withAppendedId(uri, 10);
- }
- }