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.需要操作的ContentProvider,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:
(1).scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为: content://。
(2).主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
(3).路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
要操作contact表中id为10的记录,可以构建这样的路径:/contact/10
要操作contact表中id为10的记录的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_TYPE和CONTENT_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.1)getType方法根据传入的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.UriMatcher、ContentUrist和ContentResolver简介
因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher和ContentUris。掌握它 们的使用,会便于我们的开发工作。
(1)UriMatcher:用于匹配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
(2)ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
withAppendedId(uri,id)用于为路径加上ID部分(因为db.insert操作是没有添加id的)
parseId(uri)方法用于从路径中获取ID部分
(3)ContentResolver:当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用 Activity提供的getContentResolver()方法。ContentResolver使用insert、delete、query、
update方法,来操作数据;notifyChange用于通知注册的观察对象这一行已更新。