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代码
  1. packagecom.svse.contentprovider;
  2. importandroid.net.Uri;
  3. importandroid.os.Bundle;
  4. importandroid.provider.ContactsContract;
  5. importandroid.provider.ContactsContract.CommonDataKinds.Email;
  6. importandroid.provider.ContactsContract.CommonDataKinds.Phone;
  7. importandroid.provider.ContactsContract.CommonDataKinds.StructuredName;
  8. importandroid.provider.ContactsContract.Data;
  9. importandroid.provider.ContactsContract.RawContacts;
  10. importandroid.app.Activity;
  11. importandroid.content.ContentResolver;
  12. importandroid.content.ContentUris;
  13. importandroid.content.ContentValues;
  14. importandroid.content.UriMatcher;
  15. importandroid.database.Cursor;
  16. importandroid.view.Menu;
  17. importandroid.view.View;
  18. importandroid.view.View.OnClickListener;
  19. importandroid.widget.Button;
  20. importandroid.widget.Toast;
  21. publicclassMainActivityextendsActivity{
  22. privateButtoninsert,delete,update,read;
  23. protectedvoidinit(){
  24. insert=(Button)findViewById(R.id.insertContact);
  25. delete=(Button)findViewById(R.id.deleteContacts);
  26. update=(Button)findViewById(R.id.updateContacts);
  27. read=(Button)findViewById(R.id.readContact);
  28. }
  29. protectedvoidonCreate(BundlesavedInstanceState){
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.main);
  32. /*初始化组件对象*/
  33. init();
  34. /*为read设置按钮点击事件监听器*/
  35. read.setOnClickListener(newOnClickListener(){
  36. publicvoidonClick(Viewv){
  37. readContacts();
  38. }
  39. });
  40. insert.setOnClickListener(newOnClickListener(){
  41. @Override
  42. publicvoidonClick(Viewv){
  43. //TODOAuto-generatedmethodstub
  44. insertContacts();
  45. }
  46. });
  47. delete.setOnClickListener(newOnClickListener(){
  48. @Override
  49. publicvoidonClick(Viewv){
  50. //TODOAuto-generatedmethodstub
  51. deleteContacts();
  52. }
  53. });
  54. update.setOnClickListener(newOnClickListener(){
  55. @Override
  56. publicvoidonClick(Viewv){
  57. //TODOAuto-generatedmethodstub
  58. //updateContacts();
  59. }
  60. });
  61. }
  62. /*读取联系人信息*/
  63. publicvoidreadContacts(){
  64. /*获取ContentResolver对象,使用getContentResolver()方法*/
  65. ContentResolvercr=this.getContentResolver();
  66. /**************************************联系人信息**********************************************/
  67. /*执行查询操作,使用query();方法*/
  68. /*参数说明:
  69. *@uri:操作ContentProvider的Uri;
  70. *@projection:查询的列;
  71. *@selecion:查询条件;
  72. *@selectionArgs:条件对应参数;
  73. *@sortOrder:排序方式;
  74. */
  75. /*获取联系人信息:Uri:ContactsContract.Contacts.CONTENT_URI*/
  76. Cursorcursor=cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
  77. /*操作游标,获取数据*/
  78. for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
  79. /*保存当前联系人的所有信息*/
  80. StringBuffersb=newStringBuffer();
  81. /*获取联系人ID*/
  82. StringcontactID=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
  83. sb.append("ID:"+contactID+"\n");
  84. /*获取联系人姓名*/
  85. Stringname=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
  86. sb.append("姓名:"+name+"\n");
  87. /**********************************************************************************************/
  88. /*通讯录表的特点:保存数据是按行保存,即:每个数据信息占一行,每行中该种属性能有多个值:
  89. *例如:一个人的电话号码能有多个;即:一个contactID下有多个phone;*/
  90. /**********************************************************************************************/
  91. /****************************获取电话号码*********************************************/
  92. //ContactsContract.CommonDataKinds.Phone.CONTENT_URI获取Phone对应MIME类型的Uri;
  93. //ContactsContract.CommonDataKinds.Phone.CONTACT_ID获取表中的联系人ID;
  94. Cursorphone=cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"=?",newString[]{contactID},null);
  95. while(phone.moveToNext()){
  96. StringphoneNumber=phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
  97. sb.append("phone:"+phoneNumber+"\n");
  98. //Toast.makeText(MainActivity.this,"_ID="+contactID+"name="+name+"phone:"+phoneNumber,1000).show();
  99. }
  100. /*游标使用后要关闭*/
  101. phone.close();
  102. /**********************************************************************************************/
  103. /************************************获取Email*************************************************/
  104. Cursoremail=cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID+"=?",newString[]{contactID},null);
  105. while(email.moveToNext()){
  106. StringemailAddress=email.getString(email.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
  107. sb.append("emailAddress:"+emailAddress+"\n");
  108. //Toast.makeText(MainActivity.this,"_ID="+contactID+"name="+name+"Email:"+emailAddress,1000).show();
  109. }
  110. email.close();
  111. /**********************************************************************************************/
  112. Toast.makeText(MainActivity.this,sb.toString(),1000).show();
  113. }
  114. cursor.close();
  115. }
  116. /*添加联系人*/
  117. publicvoidinsertContacts(){
  118. /*************************************方式一*******************************************************/
  119. /*首先:需要向RawContacts.CONTENT_URI执行一个空值的插入,目的是获取系统返回的rawConatactId,
  120. *这是后面插入data表的依据,只有执行空值的插入,才能使插入的联系人在通讯录里可见*/
  121. ContentValuesvalues=newContentValues();
  122. /*向RawContacts.CONTENT_URI执行一个空值的插入,返回rawContactId*/
  123. UrirawContactUri=this.getContentResolver().insert(RawContacts.CONTENT_URI,values);
  124. /*从Uri路径中获取ID的部分*/
  125. longrawContactId=ContentUris.parseId(rawContactUri);
  126. values.clear();
  127. /*data表中的数据结构特点:每个数据信息以行进行保存,所以每次添加一行数据*/
  128. /*向data表中插入姓名*/
  129. values.put(Data.RAW_CONTACT_ID,rawContactId);//ID
  130. values.put(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE);//内容的类型
  131. values.put(StructuredName.GIVEN_NAME,"张三峰");
  132. this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI,values);
  133. values.clear();
  134. /*向data表中插入移动电话*/
  135. values.put(Data.RAW_CONTACT_ID,rawContactId);
  136. values.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE);
  137. values.put(Phone.NUMBER,"15337178625");
  138. values.put(Phone.TYPE,Phone.TYPE_MOBILE);//电话的类型:工作电话移动电话家庭电话
  139. this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI,values);
  140. values.clear();
  141. /*向data表中插入工作电话*/
  142. values.put(Data.RAW_CONTACT_ID,rawContactId);
  143. values.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE);
  144. values.put(Phone.NUMBER,"02787878989");
  145. values.put(Phone.TYPE,Phone.TYPE_WORK);//电话的类型:工作电话移动电话家庭电话
  146. this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI,values);
  147. values.clear();
  148. /*向data表中添加Email*/
  149. values.put(Data.RAW_CONTACT_ID,rawContactId);
  150. values.put(Data.MIMETYPE,Email.CONTENT_ITEM_TYPE);
  151. values.put(Email.DATA,"15337178625@qq.com");
  152. values.put(Email.TYPE,Email.TYPE_WORK);//电话的类型:工作电话移动电话家庭电话
  153. this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI,values);
  154. values.clear();
  155. Toast.makeText(MainActivity.this,"数据添加成功!",1000).show();
  156. /********************************************************************************************************/
  157. /*********************************方式二:批量添加,处于同一个事务**************************************/
  158. }
  159. /*删除*/
  160. publicvoiddeleteContacts(){
  161. /*首先获取CotentResolver对象,用于操作ContentProvider*/
  162. ContentResolvercr=this.getContentResolver();
  163. /*思路:删除一个联系人的所有,则根据RAW_CONTACT_ID进行删除*/
  164. cr.delete(RawContacts.CONTENT_URI,RawContacts.CONTACT_ID+"=?",newString[]{"1"});
  165. Toast.makeText(MainActivity.this,"数据删除成功",1000).show();
  166. }
  167. //
  168. ///*修改*/
  169. //publicvoidupdateContacts(){
  170. //ContentResolvercr=this.getContentResolver();
  171. //
  172. ///*获取ID,需要修改的联系人ID,然后确定修改信息*/
  173. //ContentValuesvalues=newContentValues();
  174. //values.put(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE);//值的类型
  175. //values.put(StructuredName.GIVEN_NAME,"张无忌");
  176. //cr.update(ContactsContract.Contacts.CONTENT_URI,values,ContactsContract.Data.DISPLAY_NAME+"=?",newString[]{"张三峰"});
  177. //Toast.makeText(MainActivity.this,"修改成功",1000).show();
  178. //readContacts();
  179. //}
  180. //
  181. /*UriMathcer类的用法*/
  182. publicvoiduriMatcher(){
  183. /*常量UriMatche.NO_MATCH标示部匹配任何路径的返回码*/
  184. UriMatchersMatcher=newUriMatcher(UriMatcher.NO_MATCH);
  185. /*如果match()方法匹配content://cn.itcast.provider.personprovider/person路径,
  186. *返回匹配码为1
  187. */
  188. /*添加需要匹配的URL,如果匹配就会返回匹配码*/
  189. sMatcher.addURI("cn.itcast.provider.personprovider","person",1);
  190. /*#为通配符*//*match():方法匹配:content://cn.itcast.provider.personprovider/person/230
  191. *路径,返回匹配码2
  192. **/
  193. sMatcher.addURI("cn.itcast.provider.personprovider","person/#",2);
  194. /*按上述添加的规则进行匹配,不同的路径匹配返回不同的匹配码*/
  195. intcode=sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"));
  196. /**********************************************************************/
  197. //ContentUris的介绍
  198. /*将字符串转换成Uri*/
  199. Uriuri=Uri.parse("content://cn.itcast.provider.personprovider/person");
  200. /*为路径添加ID部分*/
  201. UriresultUri=ContentUris.withAppendedId(uri,10);
  202. }
  203. }

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android(安卓)的网络编程(4)-HttpClient接口
  5. ServiceManager & SystemService
  6. Android打开MyEclipse报错:发现了以元素 'd:skin' 开头的无效内容
  7. Android读写文件和TextView的滚动
  8. Android(安卓)源码 URLUTIL 判断文件类型问题
  9. Android中比较常见的Java super关键字

随机推荐

  1. Android AIDL demo
  2. android 底座充电压力插拔,有概率没有提示
  3. android 获取对话框关闭事件
  4. Android一些经常涉及到的权限【转】
  5. This text field does not specify an in
  6. android wrapper C调用java api
  7. Android跨进程通信IPC之11——Binder驱动
  8. android上传图片至服务器
  9. Android导出Kml
  10. minSdkVersion,targetSdkVersion,maxSdkVer