Android四大组件之:ContentProvider

原创 2016年08月30日 21:35:28

     每日一搏之Android四大组件之:ContentProvider

 今天是Android四大组件的最后一篇啦!有点小成就,有点小激动。废话少说,进入主题。

ContentProvider中文:内容提供者。字面意识就是把自己的内容提供给被人的人。在Android中的意思就是把app自己的数据提供给其他app,或者说共享给其他app。共享的权限可以自己设置,主要有增删改查。比如现在很多app可以获取到手机联系人或者获取到手机里面的图片。那么提供联系人的就做内容提供者,而去获取这些内容的叫做内容解析者。

下面通过一个Dome来认识这个组件。


  今天的案例没有界面,主要有以上几个java类,DbHelper  这里类是一个SQLite 的实现,主要就是创建一个表,具体的就不在这里讲了,大家可以下载Dome。

MainActivity  这个是app的主类,今天没用到

MyContentProvider 这个是几天的主要内容,主要用来创建一个内容提供者和一些实现方法

MyTest 这个是一个测试类,因为用两个app来测试比较麻烦,所以我们可以用一个测试类来代替,实现测试类需要在AndroidManif.xml 中注册。

下面贴代码

<span style="font-family:FangSong_GB2312;font-size:14px;">	//声明日志标识
	private static final String Tag = "MyContentProvider";  

	//声明一个SQLite
	private DbHelper helper;

	//声明两个标识
	
	private static final int STUDENTS = 1;      //表示对数据库进行多行操作
	private static final int STUDENT = 2;     //表示对数据库进行单行操作

	
	//声明一个Uri管理类
	private static final UriMatcher uriMatcher = new UriMatcher(
			UriMatcher.NO_MATCH);  //UriMatcher.NO_MATCH 表示没有匹配的
	
	
	//为uriMatcher 添加两个静态的uri
	static {
		uriMatcher.addURI("com.example.contentproviderdemo.MyContentProvider",   //这里一个参数就是我们的内容提供者的标识
				"student", STUDENTS);
		uriMatcher.addURI("com.example.contentproviderdemo.MyContentProvider",
				"student/#", STUDENT);
	}

	//获取Type
	//通过返回一个字符串,系统可以判断是进行多条操作还是单条操作
	@Override
	public String getType(Uri uri) {
		int flag = uriMatcher.match(uri);
		switch (flag) {
		case STUDENT:
			return "vnd.android.cursor.item/student";
		case STUDENTS:
			return "vnd.android.cursor.dir/student";
		}
		return null;
	}

	//对数据库进行插入数据的操作
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// insert into student values(?,?)
		Uri resultUri = null;
		int flag = uriMatcher.match(uri);
		switch (flag) {
		case STUDENTS:
			SQLiteDatabase database = helper.getWritableDatabase();  //创建数据库操作类
			long id = database.insert("student", null, values);      
			resultUri = ContentUris.withAppendedId(uri, id);         这里需要返回一个uri类给其他app使用
			Log.i(Tag, resultUri.toString());
			return resultUri;

		}
		return null;
	}

	//创建内容提供者
	@Override
	public boolean onCreate() {
		helper = new DbHelper(getContext()); //实例化SQLite
		return false;
	}
</span>

这里我实现一个插入操作,其他查询,修改,删除都是差不多的,只要按照正常的SQLite操作基本都可以实现。

上面说到一个内容提供者的标识,是什么呢?系统中有很多内容提供者,那系统要如何区分它们呢?就想我们的身份证一样,系统通过这个标识才能找到这个内容提供者。

同时内容解析者也通过标识才能获取内容。

到这里就实现了内容提供者的创建,下面我们来实现一个测试类

<span style="font-family:FangSong_GB2312;font-size:14px;">public class MyTest extends AndroidTestCase {

	public void insertDB() {

		//创建一个内容解析者
		ContentResolver contentResolver = getContext().getContentResolver();
		
		//创建一个uri 使用content://+授权路径
		Uri uri = Uri
				.parse("content://com.example.contentproviderdemo.MyContentProvider/student");
		
		//创建插入的数据
		ContentValues values = new ContentValues();
		values.put("name", "张三");
		values.put("address", "北京");
		//内容解析者直接执行内容提供者中的已经定义好的方法
		contentResolver.insert(uri, values);

	}</span>

这是一个测试类,其中有用到一个uri。

Uri代表了要操作的数据,Uri主要包含了两部分信息
①需要操作的ContentProvider
②对ContentProvider中的什么数据进行操作

 

组成部分
①scheme:ContentProvider的scheme已经由Android所规定为content://
②主机名(Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。建议为公司域名,保持唯一性
③路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定:

 

要操作person表中id为10的记录
content://cn.xyCompany.providers.personProvider/person/10

 

要操作person表中id为10的记录的name字段
content://cn.xyCompany.providers.personProvider/person/10/name

 

要操作person表中的所有记录
content://cn.xyCompany.providers.personProvider/person


内容提供者的基本内容就是这些啦,这样看内容提供者好像没什么用啊。其实大有用处。比如现在很多手机可以直接获取到手机联系人,这个就是一个内容提供者的应用。好的,那么Android四大组件就到这里啦。接下来给我两天时间,我将写一个融合Android四大组件的小案例,大家敬请期待。


鄙人林小白,英文名:LinLitterWhite,Android领域的小小白,博文中有错的地方,欢迎大家指出!必将重谢!晚安



案例下载




深入剖析Android四大组件(七)——Activity启动的4个阶段

在Activity的启动流程中,共有4个阶段: 1.第一阶段——启动信息翻译以及服务调用 2.第二阶段——Activity的相关处理 3.第三阶段——处理应用程序进程 4.第四阶段——显示应用程序并处...
  • liyuanjinglyj
  • liyuanjinglyj
  • 2015年11月21日 20:35
  • 5828

深入剖析Android四大组件(一)——Activity生命周期详解

虽然如此,但即使你没有实现onSaveInstanceState()方法,也还是有一些Activity的状态通过Activity类默认实现的onSaveInstanceState()方法恢复。特别是,...
  • liyuanjinglyj
  • liyuanjinglyj
  • 2015年07月25日 19:37
  • 2994

Android四大组件之Activity

Android四大组件之Activity一、Activity的生命周期Activity是android的四大组件之一,可以说是Android四大组件中最重要的组件之一。它负责了我们的界面显示,实际开发...
  • Mr_dsw
  • Mr_dsw
  • 2015年09月03日 21:36
  • 1356

基于场景解读Android四大组件

谈到Android四大组件:Activity,Service,Broadcast和ContentProvider,大部分人应该都比较熟悉了,因为会使用这四大组件是作为一个App开发者的基本功。但是,大...
  • okgays
  • okgays
  • 2017年04月02日 14:21
  • 315

Android开发 四大组件是否运行在主线程中?

Android的四大组件是不是运行在主线程中?打了log,做个笔记. 先上图: 图没有说服力,因为log是我写的.哈哈. 1.activity 在onCreate()里面打印当前的线程...
  • qq_31383345
  • qq_31383345
  • 2016年11月23日 12:59
  • 2230

Android源码解析四大组件系列(四)---Activity启动详细流程

在上一篇博客http://www.jianshu.com/p/98fa08ee1bfb,我们起码知道了Zygote是怎么启动SystemServer进程的,AMS是怎么注册的,启动的,启动之后通过So...
  • u013263323
  • u013263323
  • 2017年03月08日 14:53
  • 419

Android四大组件及其联系纽带Intent

一、Activity —— 应用表示层( 基类 Activity )         一个活动表示一个可视化的用户界面,关注一个用户从事的事件。例如,一个活动可能表示一个用户可选择的菜单项列表,...
  • java_xxoo_android
  • java_xxoo_android
  • 2014年12月22日 20:35
  • 1489

四大组件安全

本文为学习记录,将一些重点记录下。参考droidsec网站。推荐大家关注一下。 Activity:http://www.droidsec.cn/android-activtity-security/ ...
  • u012195899
  • u012195899
  • 2016年11月30日 17:27
  • 544

Andriod 的四大组件及其作用

Android 开发的四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(Broadcast Receive),勇于接收广播;内容...
  • shiretan
  • shiretan
  • 2017年02月13日 20:49
  • 857

Android四大组件之Activity的四种启动模式

一个应用中可能有多个界面 那么每个界面展示的次序不同,创建的先后顺序不同,存储界面的内存方式也不同,我们称这种存储方式为任务栈。 1. 栈的特点:先进后出 2. 任务栈的配置位置:AndroidM...
  • caidie_huang
  • caidie_huang
  • 2016年10月27日 17:20
  • 181
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android四大组件之:ContentProvider
举报原因:
原因补充:

(最多只允许输入30个字)