一.Android四大组件

Android四大组件是Activity, Service, Content Provider,Broadcast Receiver。

Activity作为程序界面,直接与用户交互

Service运行在后台,没有界面,完成特定的功能

ContentProvider维护应用数据,方便应用本身或其它应用访问

Broadcast Receiver提供异步广播消息接收机制,便于各应用/组件进行交互

二.什么是ContentProvider

ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。

1.ContentProvider
        Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。
主要方法:

[java] view plaincopy print?
  1. <span style="font-size:12px;">public boolean onCreate() 在创建ContentProvider时调用
  2. public Cursor query(Uri, String[], String, String[], String) 用于查询指定Uri的ContentProvider,返回一个Cursor
  3. public Uri insert(Uri, ContentValues) 用于添加数据到指定Uri的ContentProvider中
  4. public int update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的数据
  5. public int delete(Uri, String, String[]) 用于从指定Uri的ContentProvider中删除数据
  6. public String getType(Uri) 用于返回指定的Uri中的数据的MIME类型
  7. *如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。
  8. 例如:要得到所有person记录的Uri为content://contacts/person,那么返回的MIME类型字符串为"vnd.android.cursor.dir/person"。
  9. *如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。
  10. 例如:要得到id为10的person记录的Uri为content://contacts/person/10,那么返回的MIME类型字符串应为"vnd.android.cursor.item/person"。</span>

2.ContentResolver
        当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。

[java] view plaincopy print?
  1. <span style="font-size:12px;">ContentResolver cr = getContentResolver();</span>

ContentResolver提供的方法和ContentProvider提供的方法对应的有以下几个方法。

[java] view plaincopy print?
  1. <span style="font-size:12px;">public Uri insert(Uri uri, ContentValues values) 用于添加数据到指定Uri的ContentProvider中。
  2. public int delete(Uri uri, String selection, String[] selectionArgs) 用于从指定Uri的ContentProvider中删除数据。
  3. public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于更新指定Uri的ContentProvider中的数据。
  4. public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用于查</span>询指定Uri的ContentProvider。

3.Uri

Uri 代表了要操作的数据,Uri 主要包含了两部分信息:1、需要操作的
ContentProvider;2、对ContentProvider中的什么数据进行操作。一个Uri由以
下几部分组成: 

ContentProvider的scheme已经由Android所规定,scheme为content://。 
主机名(authorities)用于唯一标识这个ContentProvider,外部调用者可以根据
它找到对应的内容提供者(ContentProvider)。 
路径(Path)可以用来表示我们要操作的数据,路径的构建应该根据业务而定,
如下: 
要操作Person表中ID 为10的记录,可以构建这样的路径:/person/id/10,也
可以为/prson/10,构建什么样的路径需要与UriMatcher中注册的匹配Uri相一
致。例如:/person/id/10,那么匹配Uri需要也需要带id 为/preson/id/#,否则
可以写成/person/10. 
要操作person表中的所有记录,可以这样构建路径:/person 
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法。如下: 
Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person") 

三、UriMatcher类使用介绍

因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher和ContentUris 。掌握它们的使用,会便于我们的开发工作。
UriMatcher类用于匹配Uri,它的用法如下:
首先第一步把你需要匹配Uri路径全部给注册上,如下:

[java] view plaincopy print?
  1. <span style="font-size:12px;color:#000000;">//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
  2. UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  3. //如果match()方法匹配content:
  4. //com.ljq.provider.personprovider/person路径,返回匹配码为1,匹配Uri注册如下:
  5. sMatcher.addURI("com.ljq.provider.personprovider", person", 1);
  6. //添加需要匹配uri,如果匹配就会返回匹配码
  7. //如果match()方法匹配content://com.ljq.provider.personprovider/person/230路径,返回匹配码为2,配Uri注册如下:
  8. sMatcher.addURI("com.ljq.provider.personprovider", "person/#", 2);
  9. //#号为通配符
  10. //传入Uri,进行匹配
  11. switch (sMatcher.match(Uri.parse("content://com.ljq.provider.personprovider/person/10"))) {
  12. case 1
  13. break;
  14. case 2
  15. break;
  16. default://不匹配
  17. break;
  18. }   </span>

注册完需要匹配的Uri后,就可以使用sMatcher.match(uri)对输入的uri进
匹配,如果匹配正确就返回匹配码,匹配码是addUri()方法传入的第三个
数,假设匹配content://com.ljq.provider.personprovider/person 路径,返回
匹配码为1。

四、ContentUris介绍

ContentUris用于操作Uri后面的ID 部分,它有两个实用的方法: 
WithAppendedId(uri, id)用于为uri路径加上id 部分,如下:

[java] view plaincopy print?
  1. <span style="font-size:12px;color:#000000;">Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person")
  2. Uri resultUri = ContentUris.withAppendedId(uri, 10);
  3. //生成后的Uri为:content://com.ljq.provider.personprovider/person/10
  4. parseId(uri)用于从路径中获取Id,如下:
  5. Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person/10")
  6. long personid = ContentUris.parseId(uri);
  7. //获取的结果为:10</span>

五、监听ContentProvider中数据的变化

如果ContentProvider的访问者需要知道ContentProvider中数据发生变化,可以在ContentProvider中数据发生变化时调用getContentResovler().notifyChange(uri, null)来通知注册在此uri上的访问者,如下:

[java] view plaincopy print?
  1. <span style="font-size:12px;color:#000000;">public class PersonContentProvider extends ContentProvider {
  2. public Uri insert(Uri uri, ContentValues values) {
  3. db.insert("person", "personid", values);
  4. getContext().getContentResolver().notifyChange(uri, null);
  5. }
  6. }   </span>

如果ContentProvider 的访问者需要得到数据变化通知,必须使用ContentObserver对数据(数据采用Uri描述)进行监听,当监听到数据变化通知时,系统就会调用ContentObserver的onChange()方法,如下:

[java] view plaincopy print?
  1. <span style="font-size:12px;color:#000000;">getContentResolver().registerContentObserver(Uri.parse("content://com.ljq.providers.personprovider/person"),
  2. true, new PersonObserver(new Handler()));
  3. public class PersonObserver extends ContentObserver{
  4. public PersonObserver(Handler handler) {
  5. super(handler);
  6. }
  7. public void onChange(boolean selfChange) {
  8. //此处可以进行相应的业务处理
  9. }
  10. }   </span>

六、具体实例

[java] view plaincopy print?
  1. <span style="font-size:12px;color:#000000;">public class FirstContentProvider extends ContentProvider {
  2. // UriMatcher类主要用来匹配Uri
  3. private static final UriMatcher uriMatcher = new UriMatcher(
  4. UriMatcher.NO_MATCH);
  5. private MySqlite mysqlite;
  6. static {
  7. // 注册向外部程序提供的Uri
  8. uriMatcher.addURI(UserInfo.AUTOR, "userinfo", 1);
  9. uriMatcher.addURI(UserInfo.AUTOR, "userinfoall", 2);
  10. }
  11. //删除数据
  12. @Override
  13. public int delete(Uri uri, String selection, String[] selectionArgs) {
  14. int number = 0;
  15. if (uriMatcher.match(uri) == 1) {
  16. // 根据条件删除数据,并获取删除的行数
  17. number = mysqlite.getReadableDatabase().delete("user_info",
  18. selection, selectionArgs);
  19. }
  20. // 通知数据已经改变
  21. getContext().getContentResolver().notifyChange(uri, null);
  22. return number;
  23. }
  24. @Override
  25. public String getType(Uri uri) {
  26. return null;
  27. }
  28. //插入数据
  29. @Override
  30. public Uri insert(Uri uri, ContentValues values) {
  31. String name = values.getAsString(UserInfo.User.NAME).toString();
  32. String age = values.getAsInteger(UserInfo.User.AGE).toString();
  33. String maxId = "select max(id) id from user_info";
  34. Cursor cursor = mysqlite.getReadableDatabase().rawQuery(maxId, null);
  35. cursor.moveToFirst();
  36. int userid = cursor.getInt(0) + 1;
  37. if (uriMatcher.match(uri) == 1) {
  38. mysqlite.getWritableDatabase().execSQL(
  39. "insert into user_info values(?,?,?)",
  40. new String[] { String.valueOf(userid), name, age });
  41. }
  42. return uri;
  43. }
  44. // 连接数据库
  45. @Override
  46. public boolean onCreate() {
  47. mysqlite = new MySqlite(getContext(), "userinfo.db", null, 1);
  48. return true;
  49. }
  50. //查询数据
  51. @Override
  52. public Cursor query(Uri uri, String[] projection, String selection,
  53. String[] selectionArgs, String sortOrder) {
  54. SQLiteDatabase sqlite = mysqlite.getReadableDatabase();
  55. String str = "select name,age from user_info";
  56. if (uriMatcher.match(uri) == 1) {
  57. str += " where " + selection;
  58. }
  59. Cursor cursor = sqlite.rawQuery(str, selectionArgs);
  60. return cursor;
  61. }
  62. //修改数据
  63. @Override
  64. public int update(Uri uri, ContentValues values, String selection,
  65. String[] selectionArgs) {
  66. SQLiteDatabase sqlite = mysqlite.getReadableDatabase();
  67. int number = 0;
  68. if (uriMatcher.match(uri) == 1) {
  69. number = sqlite.update("user_info", values, selection,
  70. selectionArgs);
  71. }
  72. return number;
  73. }
  74. }  </span>

转载:http://blog.csdn.net/chaoyu168/article/details/50394137

Android中ContentProvider组件详解相关推荐

  1. 【Android】Android中ContentProvider组件详解

    原文来自:http://blog.csdn.net/zuolongsnail/article/details/6566317 ContentProvider(内容提供者)是Android中的四大组件之 ...

  2. Android中BroadcastReceiver组件详解

    Android系统的4个组件终于还剩一种组件了BroadcastReceiver,这个组件是全局监听器,可以监听系统全局的广播消息,可以方便的实现系统中不同组件之间的通信 BroadcastRecei ...

  3. android调webview的方法,Android中的WebView详解

    Android中的WebView详解 WebView详解 基本用法 布局文件配置WebView android:id="@+id/wv_news_detail" android:l ...

  4. java jtable组件_java中jtable组件详解实例

    java中jtable组件详解实例 java 表格控件 JTable 常用操作详解 JTable 是 Swing 编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处.一 ...

  5. Android 中malloc_debug 原理详解

    版本基于:Android R 关联博文: Android 中malloc_debug 使用详解 0. 前言 最近上项目中遇到一个native 可能内存泄漏的问题,曾考虑使用HWASAN,但这个工具是针 ...

  6. Android中mesure过程详解 (结合Android 4.0.4 最新源码)

    如何遍历并绘制View树?之前的文章Android中invalidate() 函数详解(结合Android 4.0.4 最新源码)中提到invalidate()最后会发起一个View树遍历的请求,并通 ...

  7. Android中layout过程详解 (结合Android 4.0.4 最新源码)

    上一篇文章Android中mesure过程详解 (结合Android 4.0.4 最新源码)介绍了View树的measure过程,相对与measure过程,本文介绍的layout过程要简单多了,正如l ...

  8. Android笔记——四大组件详解与总结

    android四大组件分别为activity.service.content provider.broadcast receiver. -------------------------------- ...

  9. Android基础四大组件详解

    Android四大组件详解 博主接触Android开发将近一年,从最初的JavaSE开始,到Android基础,一直学的糊糊涂涂,最近想整理一番 android基础, 顺便把自己的学习开发经验分享给大 ...

最新文章

  1. 构造函数未定义_构造函数(constructor)和观察者模式,谁略胜一筹呢?
  2. UA MATH567 高维统计III 随机矩阵3 集网与覆盖
  3. vue自定义指令截取图片中心显示
  4. java多态的理解(运行时多态)_Java多态的理解
  5. oracle-group by -having
  6. React开发(207):react代码分割之context的动态
  7. 常用的文本编辑器介绍
  8. opencv jpg作为png背景_基于OpenCV与tensorflow实现实时手势识别
  9. oracle10.2.0.4 dbca,在rhel5上oracle 10.2.0.4 上dbca silent删除数据库
  10. 聊天记录曝光,T-Mobile 证实内部工具和源代码遭 Lapsus$ 访问
  11. paip.c++ qt __gxx_personality_sj0 __gxx_personality_v0问题的解决
  12. cocos2dx学习笔记(一)在cocos2dx 中使用spine骨骼动画
  13. python爬虫100个入门项目
  14. Python爬虫之爬取酷狗音乐
  15. python自动抠图软件_比PS还好用!Python 20行代码批量抠图
  16. 上海市建筑工程资料管理软件
  17. Nginx实现会话保持
  18. oracle 转chr,[Oracle]Oracle之Chr函数返回
  19. spi slaver接口的fpga实现
  20. AVL树【图示详解+代码实现】

热门文章

  1. 基于XMPP协议的Android即时通信系
  2. (林雷看来13):功能优先,发展和重建同步,业绩后
  3. 自己在总结前人经验下弄的几个opencv封装函数
  4. 解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)
  5. CISCO路由器的备份与还原(1)
  6. XStream---Java对象和XML之间的转换器
  7. html,htm,jhtml
  8. 数据结构之各排序算法
  9. 解决Ubuntu 16.04 SSH无法远程登录问题(使用root登录)
  10. CSS3秘笈复习:第一章第二章第三章