Android入门进阶教程(20)-ContentProvider 数据共享
16lz
2021-01-25
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必须相对应;
具体实现代码:
Java代码
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必须相对应;
具体实现代码:
Java代码
- packagecom.svse.contentprovider;
- importandroid.net.Uri;
- importandroid.os.Bundle;
- importandroid.provider.ContactsContract;
- importandroid.provider.ContactsContract.CommonDataKinds.Email;
- importandroid.provider.ContactsContract.CommonDataKinds.Phone;
- importandroid.provider.ContactsContract.CommonDataKinds.StructuredName;
- importandroid.provider.ContactsContract.Data;
- importandroid.provider.ContactsContract.RawContacts;
- importandroid.app.Activity;
- importandroid.content.ContentResolver;
- importandroid.content.ContentUris;
- importandroid.content.ContentValues;
- importandroid.content.UriMatcher;
- importandroid.database.Cursor;
- importandroid.view.Menu;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.Toast;
- publicclassMainActivityextendsActivity{
- privateButtoninsert,delete,update,read;
- protectedvoidinit(){
- insert=(Button)findViewById(R.id.insertContact);
- delete=(Button)findViewById(R.id.deleteContacts);
- update=(Button)findViewById(R.id.updateContacts);
- read=(Button)findViewById(R.id.readContact);
- }
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- /*初始化组件对象*/
- init();
- /*为read设置按钮点击事件监听器*/
- read.setOnClickListener(newOnClickListener(){
- publicvoidonClick(Viewv){
- readContacts();
- }
- });
- insert.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- insertContacts();
- }
- });
- delete.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- deleteContacts();
- }
- });
- update.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- //updateContacts();
- }
- });
- }
- /*读取联系人信息*/
- publicvoidreadContacts(){
- /*获取ContentResolver对象,使用getContentResolver()方法*/
- ContentResolvercr=this.getContentResolver();
- /**************************************联系人信息**********************************************/
- /*执行查询操作,使用query();方法*/
- /*参数说明:
- *@uri:操作ContentProvider的Uri;
- *@projection:查询的列;
- *@selecion:查询条件;
- *@selectionArgs:条件对应参数;
- *@sortOrder:排序方式;
- */
- /*获取联系人信息:Uri:ContactsContract.Contacts.CONTENT_URI*/
- Cursorcursor=cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
- /*操作游标,获取数据*/
- for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
- /*保存当前联系人的所有信息*/
- StringBuffersb=newStringBuffer();
- /*获取联系人ID*/
- StringcontactID=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
- sb.append("ID:"+contactID+"\n");
- /*获取联系人姓名*/
- Stringname=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;
- Cursorphone=cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"=?",newString[]{contactID},null);
- while(phone.moveToNext()){
- StringphoneNumber=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*************************************************/
- Cursoremail=cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID+"=?",newString[]{contactID},null);
- while(email.moveToNext()){
- StringemailAddress=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();
- }
- /*添加联系人*/
- publicvoidinsertContacts(){
- /*************************************方式一*******************************************************/
- /*首先:需要向RawContacts.CONTENT_URI执行一个空值的插入,目的是获取系统返回的rawConatactId,
- *这是后面插入data表的依据,只有执行空值的插入,才能使插入的联系人在通讯录里可见*/
- ContentValuesvalues=newContentValues();
- /*向RawContacts.CONTENT_URI执行一个空值的插入,返回rawContactId*/
- UrirawContactUri=this.getContentResolver().insert(RawContacts.CONTENT_URI,values);
- /*从Uri路径中获取ID的部分*/
- longrawContactId=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();
- /********************************************************************************************************/
- /*********************************方式二:批量添加,处于同一个事务**************************************/
- }
- /*删除*/
- publicvoiddeleteContacts(){
- /*首先获取CotentResolver对象,用于操作ContentProvider*/
- ContentResolvercr=this.getContentResolver();
- /*思路:删除一个联系人的所有,则根据RAW_CONTACT_ID进行删除*/
- cr.delete(RawContacts.CONTENT_URI,RawContacts.CONTACT_ID+"=?",newString[]{"1"});
- Toast.makeText(MainActivity.this,"数据删除成功",1000).show();
- }
- //
- ///*修改*/
- //publicvoidupdateContacts(){
- //ContentResolvercr=this.getContentResolver();
- //
- ///*获取ID,需要修改的联系人ID,然后确定修改信息*/
- //ContentValuesvalues=newContentValues();
- //values.put(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE);//值的类型
- //values.put(StructuredName.GIVEN_NAME,"张无忌");
- //cr.update(ContactsContract.Contacts.CONTENT_URI,values,ContactsContract.Data.DISPLAY_NAME+"=?",newString[]{"张三峰"});
- //Toast.makeText(MainActivity.this,"修改成功",1000).show();
- //readContacts();
- //}
- //
- /*UriMathcer类的用法*/
- publicvoiduriMatcher(){
- /*常量UriMatche.NO_MATCH标示部匹配任何路径的返回码*/
- UriMatchersMatcher=newUriMatcher(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);
- /*按上述添加的规则进行匹配,不同的路径匹配返回不同的匹配码*/
- intcode=sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"));
- /**********************************************************************/
- //ContentUris的介绍
- /*将字符串转换成Uri*/
- Uriuri=Uri.parse("content://cn.itcast.provider.personprovider/person");
- /*为路径添加ID部分*/
- UriresultUri=ContentUris.withAppendedId(uri,10);
- }
- }
更多相关文章
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- Android(安卓)的网络编程(4)-HttpClient接口
- ServiceManager & SystemService
- Android打开MyEclipse报错:发现了以元素 'd:skin' 开头的无效内容
- Android读写文件和TextView的滚动
- Android(安卓)源码 URLUTIL 判断文件类型问题
- Android中比较常见的Java super关键字