ContentProvider是Android四大组件之一,所以如果是自己实现ContentProvider,需要在AndroidManifest.xml文件中进行声明,幸运的是,我们很少需要自己定义实现它,一般我们的开发只需要用到系统自己提供的ContentProvider,使用起来非常方便。

首先来让我们认识ContentProvider:

基本概念:

1.ContentProvider提供为存储和获取数据提供了统一的接口

2.使用ContentProvider可以在不同的应用程序之间共享数据

3.Android为常见的一些数据提供了ContentProvider

下面我开始介绍实现ContentProvider的过程:

1.定义一个CONTENT_URI常量

2.定义一个雷,继承自ContentProvider

3.实现query,insert,update,delete,getType和onCreate方法

4.在AndroidManifest.xml文件中进行声明

ContentProvider提供了一系列的函数,当自己实现ContentProvider需要实现这些方法:

1.query()

2.insert()

3.update()

4.delete()

5.getType()

6.onCreate()

接下来详细介绍ContentProvider:

*一.初识Content Provider
 * 1.简介
 * 1.1 Content Provider实现了一组通用的方法来提供数据的增删改查的功能
 * 1.2 客户端通常不会直接使用这些方法,大多数都是通过ContentResolver对象实现对Content Provider的操作
 * 1.3 开发一般会通过调用方法获得ContentProvider对象
 * 例如:ContentResolver cr=getContentResolver
 * 使用ContentResolver提供的方法可以获得ContentProvider中任何感兴趣的对象
 * 2.数据模型
 * 2.1 ContentProvider使用基于数据库模型的简单表格来提供其中的数据,其中每一行都代表一个记录,
 * 每一列代表特定类型和含义的数据,其中每条记录包含一个数值型的_ID字段,用于在表格中唯一标识该记录
 * 注意:ID字段前还包含了一个下划线
 * 2.2 查询返回一个Cursor对象,它能遍历各行各列来读取每个字段的值。对于各个类型的数据,Cursor对象都提供了
 * 专用的方法,因此,为了读取字段的数据,开发人员必须要知道当前字段包含的数据类型
 * 注意:Cursor的使用方法:通过查询,它会指向第一个记录之前,所以需要开发者moveToNext,且查询字段的动作是
 * 先指向某一条记录,即指向某一行,再从某一列或多列中取得数据,且需要知道数据类型(列数据),例如:
 * int id=cursor.getInt(idIndex);
 * String name=cursor.getString(displayNameIndex);
 * 3.URI的用法
 * 3.1 每个Content Provider提供公共的URI(使用Uri类包装)来唯一标识其数据集。管理多个数据集(多个表格)的
 * Content Provider为每个都提供了单独的URI,且URI的标识有固定的格式
 * 3.2 UIR常量用于所有与Content Provider的交互中,每个ContentResolver方法使用URI作为第一个参数,它标识
 * ContentResolver应该使用哪个provider以及其中的哪个表格
 * 二.详解Content Provider
 * 1.系统预定义的Content Provider
 * 1.1 Android系统为常用数据类型提供了很多预定义的Content Provider(声音,视频,图片,联系人等),它们大都位于
 * android.provider包中
 * 1.2 Android系统提供的常见Content Provider说明如下:
 *     Browser:读取或修改书签,浏览历史或网络搜索
 *     CallLog:查看或更新通话历史
 *     Contacts:获取,修改或保存联系人信息
 *     LiveFolders:由Content Provider提供内容的特定文件夹
 *     MediaStore:访问声音,视频和图片
 *     Setting:查看和获取蓝牙设置,铃声和其他设置偏好
 *     SearchRecentSuggestions:该类能为应用程序创建简单的查询建议提供者
 *     SyncStateContract:用于使用数据数组账号关联数据的ContentProvider约束
 *     UserDictionary:在可预测文本输入时,提供用户定义的单词给输入法使用
 * 2. 查询数据
 * 2.1 在Content Provider中查询数据,开发人员需要知道一下信息:
 *     标识该Content Provider的URI
 *     需要查询的数据字段名称
 *     字段中数据的类型
 * 如果需要查询特定记录,那么还需要知道该记录的ID值
 * 2.2 ContentResolver.query()或Activity.managedQuery()方法都可以完成查询功能,这两个方法
 * 使用相同的参数,并且都返回Cursor对象。其区别在于managedQuery()方法让Activity来管理Cursor的
 * 声明周期,而query()方法需要程序员自己管理。
 * 2.3 query()方法介绍
 * 方法的声明如下:
 * public final Cursor query(Uri uri, String[] projection, String selection, 
 * String[] selectionArgs, String sortOrder)
 *    uri:用于查询的Content Provider的URI值
 *    projection:由需要查询的列名组成的数组,如果为null则表示查询全部列
 *    selection:类似SQL中的WHERE子句,用于增加条件来完成数据过滤
 *    selectionArgs:用于替换selection中可以使用?表示的变量值
 *    sortOrder:用于实现排序功能
 * 返回值:Cursor对象,它位于第一条记录之前,或者为null
 * 2.4 利用游标工具进行查询时,注意是两次查询,首先到达的那条记录的行
 * 第一次查询找到需要数据的那一列,第二次查询才是真正从那一列中获得数据
 * 三.总结
 * 3.1 Content Provider是Android四大基本组件之一,它主要用于在不同的应用程序之间共享数据
 * 3.2 Content Provider使用基于数据库模型的简单表格来提供其中的数据,这里每行代表一条记录,每列
 * 代表特定类型和含义的数据
下面我用一个例子来说明ContentProvider的使用:

我们在开发的过程中经常用到联系人的信息,所以,取得联系人的信息并操纵就显得很重要,下面的例子就是对联系人的信息进行相关的操作。

下面的截图是程序的实现:

实现的源代码如下:

public class Content_Provider_Activity extends Activity {private ListView listView;private ListView listView2;private Button button;/** 1.静态常量的定义* 1.1 各个参数用于选择的目标,如果在数组中没有某个参数,则游标不会定义(即找到那个参数)* 1.2 从定义可以看出,联系人的所有信息不是定义在一张表之中* 1.3 为了操作的方便和可行,分开定义查找的目标*/public static final String[] COLUMNS={Contacts._ID,Contacts.DISPLAY_NAME};private static final String[] COLUMNS2={Contacts.DISPLAY_NAME,Contacts._ID};private static final String[] COLUMNS3={Phone.NUMBER};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_content__provider_);listView=(ListView)findViewById(R.id.listview);listView2=(ListView)findViewById(R.id.listview2);button=(Button)findViewById(R.id.button);button.setText("点击获取联系人姓名和手机号码");button.setOnClickListener(new MyButton());@SuppressWarnings("deprecation")Cursor cursor=managedQuery(Contacts.CONTENT_URI, COLUMNS, null, null, null);//获取ID所对应的索引值---列索引int idIndex=cursor.getColumnIndex(COLUMNS[0]);//获取NAME所对应的索引值---列索引int displayNameIndex=cursor.getColumnIndex(COLUMNS[1]);List<String> items=new ArrayList<String>();for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){int id=cursor.getInt(idIndex);String name=cursor.getString(displayNameIndex);items.add("id="+id+"\t 姓名= "+name);}ArrayAdapter<String> adapter=new ArrayAdapter<String>(Content_Provider_Activity.this,R.layout.list_item,items);listView.setAdapter(adapter);}public class MyButton implements OnClickListener{@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubswitch (arg0.getId()) {case R.id.button:getNameAndPhone();break;default:break;}}}public void getNameAndPhone(){@SuppressWarnings("deprecation")Cursor cursor=managedQuery(Contacts.CONTENT_URI, COLUMNS2, null, null, null);int displayNameIndex=cursor.getColumnIndex(COLUMNS2[0]);List<String> items=new ArrayList<String>();for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){String name=cursor.getString(displayNameIndex);int id=cursor.getInt(cursor.getColumnIndex(COLUMNS2[1]));@SuppressWarnings("deprecation")Cursor phone=managedQuery(Phone.CONTENT_URI, null, Phone.CONTACT_ID+" = "+id, null, null);while(phone.moveToNext()){String phoneNumber=phone.getString(phone.getColumnIndex(COLUMNS3[0]));items.add("姓名:"+name+"\t 手机:"+phoneNumber);}}ArrayAdapter<String> adapter=new ArrayAdapter<String>(Content_Provider_Activity.this, R.layout.list_item ,items);listView2.setAdapter(adapter);}
}

Android开发--详解ContentProvider/Cursor的使用相关推荐

  1. Android开发详解:第4章《UI 控件》

    Android开发详解:第4章<UI 控件> 控件是Android程序设计的基本组成单位,通过使用控件可以高效地开发Android应用程序.所以熟练掌握控件的使用是合理.有效地进行Andr ...

  2. Android开发详解之App升级程序一点通

    Android开发详解之App升级程序一点通 结束语 UpdateManager.java import java.io.File; import java.io.FileOutputStream; ...

  3. android开发--详解ListView,动态添加,删除Adapter中的数据项

    ListView是Android开发中最常用到的控件之一,所以学习ListView显得非常重要,在本文中,作者继承了BaseAdapter实现了自己的Adapter,在其中实现相应的方法,包括添加,删 ...

  4. Android开发详解:第3章《App UI 设计》

    第3章:App UI设计 3.1:UI设计的相关概念 3.3:布局管理器 3.4:常用APP UI界面设计 3.1:UI设计的相关概念 View View类在Android中可以理解为视图.它占据屏幕 ...

  5. Android开发--详解SharedPreference/PreferenceActivity

    我们经常看到应用程序的设置页面,一般用到设置页面时,我们会继承自PreferenceActivity,它实现了SharedPreference,并生成相应的XML文件自动保存用户的设置,在设置页面中, ...

  6. Android开发--详解SAX解析XML文件

    SAX技术字处理XML文件时并不是一次性把XML文件装入内存,而是一边读一边解析,因此,在解析的过程中会有几个步骤需要注意,在这里用一张图来表示解析的步骤: 在本实例中,定义了一个xml文件,其中有若 ...

  7. Android个人手机通讯录开发详解

    一.Android 个人手机通讯录开发 数据存储:SQLite 数据库 开发工具:Android Studio 二.Phone Module 简介 界面展示 文件结构简单分析 三.个人手机通讯录代码实 ...

  8. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

  9. JMessage Android 端开发详解

    JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...

最新文章

  1. php中类和对象的操作
  2. 【 MATLAB 】信号处理工具箱之波形产生函数 rectpuls
  3. 强化学习3——有模型(Model-base)与无模型(Model-free)RL的区别
  4. mysql binlo 抽取_使用mysqlbinlog根据时间点提取SQL简单方法
  5. 有符号位和无符号位。——int8疑问有感
  6. uci大学教育转计算机,UCI加州大学尔湾分校计算机科学硕士M.S. Computer Science
  7. 【Liunx】Linux 系统目录结构
  8. android 绑定微信号,Android工作整理-梳理微信的登录、分享与支付
  9. 【缺陷识别】基于matlab GUI SVM金属表面缺陷分类与测量(带面板)【含Matlab源码 1652期】
  10. Windows各个系统勒索补丁下载地址
  11. post和get的区别
  12. 基于ConfuserEx的混淆加壳
  13. 禁止搜狗拼音输入法自动更新
  14. 用计算机弹歌旧梦一场歌词,早知惊鸿一场何必情深一往是什么歌 《旧梦一场》歌词哪里听...
  15. pyqt5,波形进度条
  16. python 读取最新阿里云RDS数据库备份并下载
  17. java 正则表达式匹配冒号_java 获取冒号后面的参数(正则)实现代码
  18. 解决生产计划排程APS系统七大问题,提升企业生产效率!
  19. H5移动端网页自定义扫码
  20. 截取图片DEMO. JAVA Windows FFmpeg

热门文章

  1. 中兴被禁在全球芯片市场掀起的波澜
  2. LightRoom操作快捷键
  3. 231. Power of Two
  4. Linux awk内部变量
  5. 微软职位内部推荐-Software Engineer II-Office Incubation
  6. Wcf 基础教程 服务寄宿之 Windows 服务寄宿
  7. android之权限大全
  8. Linux C动态链接库实现一个插件例子
  9. ylb:使用sql语句实现添加、删除约束
  10. 【HDU 2028】Lowest Common Multiple Plus