关闭

Android学习--ContentProvider

279人阅读 评论(0) 收藏 举报
Android学习--------ContentProvider组件
	1ContentProvider基本概念
	(1)为存储和获取数据提供了统一的接口
	(2)可以在不同应用程序之间共享数据
	(3)Android为常见的一些数据提供了ContentProvider(音频图片 通信录等等)
	(4)ContentProvider使用表的形式来组织数据
	(6)ContentProvider所提供的函数:
	     query insert update delete getType onCreate

	2Uri 统一资源标识符
 	每个ContentProvider都拥有一个公共的URI,用于表示这个ContentProvider所提供的数据,并且就是通过这个URI来操作ContentProvider所提供的数据;
 	Android所提供的ContentProvider都存放在android.provider包中
	Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider2.ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:
	1.schemeContentProvider(内容提供者)的scheme已经由Android所规定为:	content://
	2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
	3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
	要操作contact表中id10的记录,可以构建这样的路径:/contact/10
	要操作contact表中id10的记录的name字段,contact/10/name
	要操作contact表中的所有记录,可以构建这样的路径:/contact
	要操作的数据不一定来自数据库,也可以是文件等他存储方式
	3ContentProvider的实现方法:
	(自己实现一个并不常见使用内置较多)
	1)定义一个CONTENT_URI常量
	publicstaticfinalUri CONTENT_URI= Uri.parse("content://"+ 	AUTHORIY+ "/users");;一般用类名	
	定义常量列名 必须有_ID(INTEGERPRIMARY KEY AUTOINCREMENT 如果使用sqllite3的话t	ype)(_ID这个常量是BaseColumns中已定义好的)
	数据类型通过CONTENT_TYPECONTENT_TYPE_ITEM确定
	CONTENT_TYPE= "vnd.android.cursor.dir/vnd.firstprovider.user";
	CONTENT_TYPE_ITEM= "vnd.android.cursor.item/vnd.firstprovider.user";
	表的结构可以通过implementBaseColumns来达到目的
	2)定义一个类,继承ContentProvider
	UriMatcher用于匹配URI
	uriMatcher.addURI("AUTHORITY变量","路径/#(id)",匹配常量)
 
	userProjectionMap一个<String,String>HashMap
	userProjectionMap.put(列名,列名的别名)
	3)实现query insert update deleteonCreate getType等方法
	3.1getType方法根据传入的URI 返回该URI所表示的数据类型
		eg:
		switch(uriMatcher.match(uri)){
		case匹配常量1:
		return数据类型(CONTENT_TYPE)
		case匹配常量2:
		return数据类型2(CONTENT_TYPE_ITEM)
		}
	3.2)实现insert(Uriuri,ContentValue values)方法
		eg:
		通过SQLiteDatabase操作
		返回值为代表刚刚插入数据的Uri
	3.3)实现query方法
		eg
		用到SQLiteQueryBuiler对象
		qb.setTables(表名)
		qb.setProjectionMap(之前创建的HashMap别名彪)
		对单条qb.appendWhere()
	3.4)在AndroidManifest.xml中声明
		<providerandroid:name="包名+类名"
		android:authorities="包名+类名"/> 这里的authorities一定要与定义的常量一致

	3.5)使用自定义ContentProvider
		newContentValues()存放要存入的值
		uri=getContentResolver().insert(要插入的uri,contentValues)
		Cursorc =getContentResolver().query(要查寻的uri,projection,selection,selectionArgs,sortOrder)
		getContext()获取当前运行的provider的上下文
	4.UriMatcherContentUristContentResolver简介
      因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcherContentUris。掌握它	们的使用,会便于我们的开发工作。
	1UriMatcher:用于匹配Uri,它的用法如下:
	1.1.首先把你需要匹配Uri路径全部给注册上,如下:
	//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)
	UriMatcheruriMatcher = newUriMatcher(UriMatcher.NO_MATCH);
	//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact	径,返回匹配码为1
	uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”,“contact”,1);//添加	需要匹配uri,如果匹配就会返回匹配码
	//如果match()方法匹配	content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2
	uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”,“contact/#”,2);//#	为通配符

	1.2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配	content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1

	2ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
	withAppendedId(uri,id)用于为路径加上ID部分(因为db.insert操作是没有添加id的)
	parseId(uri)方法用于从路径中获取ID部分

	3ContentResolver:当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用	Activity提供的getContentResolver()方法。ContentResolver使用insertdeletequery
	update方法,来操作数据;notifyChange用于通知注册的观察对象这一行已更新。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:15336次
    • 积分:315
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:12篇
    • 译文:0篇
    • 评论:2条
    文章分类