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};
@Override
protected 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{
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (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 Intent的使用介绍 Android 组件之间的信使Intent Android 中的数据存取和ContentProvider
android-关于ContentProvider的使用例子 有详细注释
关于android的数据存储-SQLite-ContentProvider-preferences
1、Android Room操作SQLite数据 2、ContentProvider使用,使用Room进行数据库操作
NULL 博文链接:https://sunzone.iteye.com/blog/1884167
Android应用开发使用ContentProvider以及SQLite实现对数据库的相关操作,可以直接操作数据库,也可以使用ContentProvider来对数据库进行间接操作。
利用contentprovider跨app读取联系人列表,记得先安装contentprovider_one,并且赋予读取写入权限,否则app崩溃。
filecraft-contentprovider-介绍FileCraft ContentProvider 示例 Android 应用程序。 在 Google Play 商店中与 FileCraft 一起使用。 这是示例插件应用程序的早期版本。 随着我更多地测试和使用它,事情可能会发生...
适用于 Android 的一些有用的库、示例、工具和开源应用程序 如果库在 Android 开发的几年中成为明星,则收集。 这是 android 开源库的绝对列表 ... |--- ContentProvider / ContentResolver / Cursor | |---
Android-Contacts-Programe-test 利用contentprovider来自己实现一个通讯录的程序,基本是与数据库通讯,然后调用安卓关于发短信和打电话的功能。
1.什么是内容提供者 2.说说如何创建自己应用的内容提供者 & 使用场景 3.说说ContentProvider的原理 4.ContentProvider,Co
android开发contentprovider教学ppt(内部资料).pptx
Android开发环境配置的详细介绍 1.Android的四大天王: Activity:构建应用程序界面的... ADT配置:https://dl-ssl.google.com/android/eclipse --SDK在Eclipse中的路径配置 3)Android:模拟器的配置 。。。 。。。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.tigongzhe" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" ...
Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...
www.mars-droid.com/Android开发视频教程 代码 源码 mars老师讲课 android 视频源码 TestCP源码 ContentProvider(在此特别感谢mars的无私奉献,此代码为跟随视频边学边做的)
android contentprovider使用示例
Android自学笔记-12-ContentProvider简单例子 contentprovider代码
本篇文章介绍了Android开发之ContentProvider的使用详解。需要的朋友参考下
Android知识点ContentProvider篇