原文来自:http://blog.csdn.net/zuolongsnail/article/details/6566317

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

以下这段是Google Doc中对ContentProvider的大致概述。
内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。

1.ContentProvider
Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。
主要方法:
public boolean onCreate() 在创建ContentProvider时调用
public Cursor query(Uri, String[], String, String[], String) 用于查询指定Uri的ContentProvider,返回一个Cursor
public Uri insert(Uri, ContentValues) 用于添加数据到指定Uri的ContentProvider中
public int update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的数据
public int delete(Uri, String, String[]) 用于从指定Uri的ContentProvider中删除数据
public String getType(Uri) 用于返回指定的Uri中的数据的MIME类型
*如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。
例如:要得到所有person记录的Uri为content://contacts/person,那么返回的MIME类型字符串为"vnd.android.cursor.dir/person"。
*如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。
例如:要得到id为10的person记录的Uri为content://contacts/person/10,那么返回的MIME类型字符串应为"vnd.android.cursor.item/person"。

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

[java] view plaincopy
  1. ContentResolver cr = getContentResolver();

ContentResolver提供的方法和ContentProvider提供的方法对应的有以下几个方法。
public Uri insert(Uri uri, ContentValues values) 用于添加数据到指定Uri的ContentProvider中。
public int delete(Uri uri, String selection, String[] selectionArgs) 用于从指定Uri的ContentProvider中删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于更新指定Uri的ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用于查询指定Uri的ContentProvider。

3.Uri
Uri指定了将要操作的ContentProvider,其实可以把一个Uri看作是一个网址,我们把Uri分为三部分。
第一部分是"content://"。可以看作是网址中的"http://"。
第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如"blog.csdn.net"。
第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。

下面是用ContentProvider读取联系人数据,属于系统数据。完整代码下载:android_contentprovider_system.rar

注意:这里的联系人操作有点乱,关键是我还不是很熟,SDK1.6和SDK2.1的联系人操作很有很大不同,希望哪位大侠指点一下。

[java] view plaincopy
  1. /**
  2. * MainActivity
  3. *
  4. * @author zuolongsnail
  5. */
  6. public class MainActivity extends Activity {
  7. private EditText nameET;
  8. private EditText numberET;
  9. private Button insertBtn;
  10. private Button deleteBtn;
  11. private Button queryBtn;
  12. private ListView contentView;
  13. @Override
  14. public void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.main);
  17. nameET = (EditText) findViewById(R.id.name);
  18. numberET = (EditText) findViewById(R.id.number);
  19. insertBtn = (Button) findViewById(R.id.insert);
  20. deleteBtn = (Button) findViewById(R.id.delete);
  21. queryBtn = (Button) findViewById(R.id.query);
  22. // 用于显示数据
  23. contentView = (ListView) findViewById(R.id.content);
  24. insertBtn.setOnClickListener(new OperateOnClickListener());
  25. deleteBtn.setOnClickListener(new OperateOnClickListener());
  26. queryBtn.setOnClickListener(new OperateOnClickListener());
  27. }
  28. class OperateOnClickListener implements OnClickListener {
  29. @Override
  30. public void onClick(View v) {
  31. String name = nameET.getText().toString();
  32. String number = numberET.getText().toString();
  33. Person p = new Person(name, number);
  34. switch (v.getId()) {
  35. // 插入数据
  36. case R.id.insert:
  37. insert(p);
  38. view();
  39. break;
  40. // 删除数据
  41. case R.id.delete:
  42. delete(name);
  43. view();
  44. break;
  45. // 查询数据
  46. case R.id.query:
  47. view();
  48. break;
  49. }
  50. }
  51. }
  52. // 显示数据
  53. private void view() {
  54. Cursor c = query("");
  55. ListAdapter listAdapter = new SimpleCursorAdapter(this, R.layout.list,
  56. c, new String[] { People._ID, People.NAME, People.NUMBER },
  57. new int[] { R.id.id, R.id.name, R.id.number });
  58. contentView.setAdapter(listAdapter);
  59. }
  60. // 插入联系人
  61. private void insert(Person p) {
  62. // 获得ContentResolver对象
  63. ContentResolver cr = getContentResolver();
  64. ContentValues values = new ContentValues();
  65. values.put(People.NAME, p.name);
  66. // 表示是否把联系人添加到收藏(加星),1表示加入,0表示不加入,这行代码注释默认是不加入。
  67. values.put(Contacts.People.STARRED, 1);
  68. Uri uri = Contacts.People.createPersonInMyContactsGroup(cr, values);
  69. // 获得联系人People表的Uri
  70. Uri url = Uri.withAppendedPath(uri,
  71. Contacts.People.Phones.CONTENT_DIRECTORY);
  72. values.clear();
  73. values.put(Contacts.Phones.TYPE, Contacts.Phones.NUMBER);
  74. values.put(Contacts.Phones.NUMBER, p.number);
  75. // 插入操作
  76. cr.insert(url, values);
  77. }
  78. // 插入联系人
  79. private void delete(String name) {
  80. // 获得ContentResolver对象
  81. ContentResolver cr = getContentResolver();
  82. Uri url = Contacts.People.CONTENT_URI;
  83. // 设置删除条件
  84. String where = People.NAME + "=?";
  85. String[] selectionArgs = { name };
  86. cr.delete(url, where, selectionArgs);
  87. }
  88. // 查询联系人
  89. private Cursor query(String name) {
  90. // 获得ContentResolver对象
  91. ContentResolver cr = getContentResolver();
  92. Uri uri = Contacts.People.CONTENT_URI;
  93. // 查询对象
  94. String[] projection = { People._ID, People.NAME, People.NUMBER };
  95. // 设置查询条件,这里我把selection和selectionArgs参数都设为null,表示查询全部数据
  96. String selection = null;
  97. String[] selectionArgs = null;
  98. if (!"".equals(name)) {
  99. selection = People.NAME + "=?";
  100. selectionArgs = new String[] { name };
  101. }
  102. // 设置排序条件
  103. String sortOrder = Contacts.People._ID;
  104. Cursor c = cr.query(uri, projection, selection, selectionArgs,
  105. sortOrder);
  106. // if (c.moveToFirst()) {
  107. // for (int i = 0; i < c.getCount(); i++) {
  108. // c.moveToPosition(i);
  109. // String name = c.getString(c.getColumnIndexOrThrow(People.NAME));
  110. // String number = c.getString(c
  111. // .getColumnIndexOrThrow(People.NUMBER));
  112. // }
  113. // }
  114. return c;
  115. }
  116. }

程序截图:

【Android】Android中ContentProvider组件详解相关推荐

  1. Android中ContentProvider组件详解

    一.Android四大组件 Android四大组件是Activity, Service, Content Provider,Broadcast Receiver. Activity作为程序界面,直接与 ...

  2. Android应用开发—Intent组件详解

    转载自:Android中Intent组件详解 Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件. Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的 ...

  3. Android设置中“强行停止”详解

    Android设置中"强行停止"详解 最近工作上遇到了广播接受不到的问题,查看了<Android 开发艺术探索>一书中关于广播的发送和接受的章节(P356-P362). ...

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

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

  5. Android Lifecycle 生命周期组件详解

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/99695779 本文出自[赵彦军的博客] 一.Lifecycle简介 为什么要引进 ...

  6. Android中BroadcastReceiver组件详解

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

  7. Android Studio中Gradle使用详解

    转自:http://www.jianshu.com/p/02cb9a0eb2a0 一)基本配置 build配置 buildscript {repositories {jcenter() }depend ...

  8. Flutter中AppBar组件详解

    AppBar组件主要用于定义应用程序顶部区域,可以用来展示应用程序标题.搜索入口.下拉菜单.标签栏等信息. 常用的属性如下: 1. leading 标题前置控件.在首页通常显示应用程序的Logo,其它 ...

  9. Android中的四大组件详解

    Android中的四大组件详解 我们都知道Android系统应用层框架中,为开发者提供了四大组件来便于应用的开发,它们是Activity.Service.BroadcastReceiver.Conte ...

最新文章

  1. AI芯片模型设计AI芯片到底会带来怎样的未来
  2. Apache的Rewrite规则详细介绍
  3. Symfony2Book06:路由
  4. 674 Longest Continuous Increasing Subsequence(每日一题)
  5. mybatis-通用Mapper
  6. 《从零开始学ASP.NET CORE MVC》:ASP.NET Core 中的 Main方法(5)
  7. python 根据名称获取pid_【Python学习笔记】76、常用第三方模块psutil
  8. 点击按钮打开选择文件对话框
  9. Java Swing Mysql学生信息管理系统
  10. mysql双一参数_MySQL 的双1设置-数据安全的关键参数(案例分享)
  11. 2017总结:迷茫的一年
  12. 考勤系统——代码分析datagrid
  13. Jenkins问题:SVN插件未更新到最新代码
  14. centos7系统详细安装步骤
  15. 保存书店每日交易记录程序设计
  16. 美团一点都不美,我再也不想给美团打工了
  17. 物联网 DFrobot 掌控版的使用 智能灯和MQTT
  18. PayPal开发文档整理(8)——PayPal支付产品和解决方案
  19. 2020北京国际茶业展 | 共赴茶香之约,凤牌红茶与您共品好茶
  20. cluster_acc计算

热门文章

  1. 使用遥控器控制汽车,实现高难度的泊车(发明畅想)
  2. C51语言支持哪些数据类型,C51编译器支持的数据类型(1)
  3. ai画面怎么调大小_ai如何调整对象大小
  4. Win10添加或删除开机自启项
  5. 判断数组对象里面的某个属性全部为true才执行下一步操作
  6. WampServer的研究日记二
  7. 通读AFN②--AFN的上传和下载功能分析、SessionTask及相应的session代理方法的使用细节...
  8. 【03】json使用
  9. Oracle 表数据去重
  10. MongoDB应用篇