使用ContentProvider(内容提供者)共享数据

  • Post author:
  • Post category:其他
l
使用
ContentProvider
(内容提供者)共享数据
l
Uri
介绍
Uri
代表了要操作的数据

Uri
主要包含了两部分信息:
1
》需要操作的
ContentProvider

2
》对
ContentProvider

的什么数据进行操作,一个
Uri
由以下几部分组成:
URI
ContentProvider
(内容提供者)的
scheme
已经由
Android
所规定,
scheme
为:
content://
主机名(或叫
Authority
)用于唯一标识这个
ContentProvider
,外部调用者可以根据这个标识来找到它。
路径(
path
)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下
:
要操作
person
表中
id

10
的记录,可以构建这样的路径
:/person/10
要操作
person
表中
id

10
的记录的
name
字段,
person/10/name
要操作
person
表中的所有记录,可以构建这样的路径
:/person
要操作
xxx
表中的记录,可以构建这样的路径
:/xxx
当然要操作的数据不一定来自数据库,也可以是文件、
xml
或网络等其他存储方式,如下
:
要操作
xml
文件中
person
节点下的
name
节点,可以构建这样的路径:
/person/name
如果要把一个字符串转换成
Uri
,可以使用
Uri
类中的
parse()
方法,如下:
Uri uri = Uri.parse(“content://cn.itcast.provider.personprovider/person”)
l
UriMatcher
类使用介绍
因为
Uri
代表了要操作的数据,所以我们经常需要解析
Uri
,并从
Uri
中获取数据。
Android
系统提供了两个用于操作
Uri
的工具类,分别为
UriMatcher

ContentUris
。掌握它们的使用,会便于我们的开发工作。
UriMatcher
类用于匹配
Uri
,它的用法如下:
首先第一步把你需要匹配
Uri
路径全部给注册上,如下:
//
常量
UriMatcher.NO_MATCH
表示不匹配任何路径的返回码
UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//
如果
match()
方法匹配
content://cn.itcast.provider.personprovider/person
路径,返回匹配码为
1
sMatcher.addURI(

cn.itcast.provider.personprovider

,

person

, 1);//
添加需要匹配
uri
,如果匹配就会返回匹配码
//
如果
match()
方法匹配
content://cn.itcast.provider.personprovider/person/230
路径,返回匹配码为
2
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2);
//#
号为通配符
switch (
sMatcher.match(
Uri.parse(“content://cn.itcast.provider.personprovider/person/10”
)
)) {
   case 1
    break;
   case 2
    break;
   default://
不匹配
    break;
}
注册完需要匹配的
Uri
后,就可以使用
sMatcher.match(uri)
方法对输入的
Uri
进行匹配,如果匹配就返回匹配码,
匹配码是调用
addURI()
方法传入的第三个参数,假设匹配
content://cn.itcast.provider.personprovider/person
路径,返回的匹配码为
1
l
ContentUris
类使用介绍
ContentUris
类用于获取
Uri
路径后面的
ID
部分,它有两个比较实用的方法:
withAppendedId(uri, id)
用于为路径加上
ID
部分:
Uri uri = Uri.parse(“content://cn.itcast.provider.personprovider/person”)
Uri resultUri = ContentUris.withAppendedId(uri, 10);
//
生成后的
Uri
为:
content://cn.itcast.provider.personprovider/person/10
parseId(uri)
方法用于从路径中获取
ID
部分:
Uri uri = Uri.parse(“content://cn.itcast.provider.personprovider/person/10”)
long personid = ContentUris.parseId(uri);//
获取的结果为
:10
l
使用
ContentProvider
共享数据
ContentProvider
类主要方法的作用:
public boolean onCreate()
该方法在
ContentProvider
创建后就会被调用,
Android
开机后,
ContentProvider
在其它应用第一次访问它时才
会被创建。
public Uri insert(Uri uri, ContentValues values)
该方法用于供外部应用往
ContentProvider
添加数据。
public int delete(Uri uri, String selection, String[] selectionArgs)
该方法用于供外部应用从
ContentProvider
删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
该方法用于供外部应用更新
ContentProvider
中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
该方法用于供外部应用从
ContentProvider
中获取数据。
public String getType(Uri uri)
该方法用于返回当前
Url
所代表数据的
MIME
类型。如果操作的数据属于集合类型,那么
MIME
类型字符串应该以
vnd.android.cursor.dir/
开头,例如:要得到所有
person
记录的
Uri

content://cn.itcast.provider.personprovider/person
,那么返回的
MIME
类型字符串应该为:

vnd.android.cursor.dir/person

。如果要操作的数据属于非集合类型数据,那么
MIME
类型字符串应该以
vnd.android.cursor.item/
开头,例如:得到
id

10

person
记录,
Uri

content://cn.itcast.provider.personprovider/person/10
,那么返回的
MIME
类型字符串应该为:

vnd.android.cursor.item/person


l
l
l
l
l

ContentResolver
操作
ContentProvider
中数据
当外部应用需要对
ContentProvider
中的数据进行添加、删除、修改和查询操作时,可以使用
ContentResolver

来完成,要获取
ContentResolver
对象,可以使用
Activity
提供的
getContentResolver()
方法。

ContentResolver
类提供了与
ContentProvider
类相同签名的四个方法:
public Uri insert(Uri uri, ContentValues values)
该方法用于往
ContentProvider
添加数据。
public int delete(Uri uri, String selection, String[] selectionArgs)
该方法用于从
ContentProvider
删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
该方法用于更新
ContentProvider
中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
该方法用于从
ContentProvider
中获取数据。
这些方法的第一个参数为
Uri
,代表要操作的
ContentProvider
和对其中的什么数据进行操作,假设给定的是:

Uri.parse(“content://cn.itcast.providers.personprovider/person/10”)
,那么将会对主机名为
cn.itcast.providers.personprovider

ContentProvider
进行操作,操作的数据为
person
表中
id

10
的记录。
使用
ContentResolver

ContentProvider
中的数据进行添加、删除、修改和查询操作:
ContentResolver resolver =  getContentResolver();
Uri uri = Uri.parse(“content://cn.itcast.provider.personprovider/person”);
//
添加一条记录
ContentValues values = new ContentValues();
values.put(“name”, “itcast”);
values.put(“age”, 25);
resolver.insert(uri, values);
//
获取
person
表中所有记录
Cursor cursor = resolver.query(uri, null, null, null, “personid desc”);
while(cursor.moveToNext()){
Log.i(“ContentTest”, “personid=”+ cursor.getInt(0)+ “,name=”+ cursor.getString(1));
}
//

id

1
的记录的
name
字段值更改新为
liming
ContentValues updateValues = new ContentValues();
updateValues.put(“name”, “liming”);
Uri updateIdUri = ContentUris.withAppendedId(uri, 2);
resolver.update(updateIdUri, updateValues, null, null);
//
删除
id

2
的记录
Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
resolver.delete(deleteIdUri, null, null);
这是另外一个项目 测试得类
 先运行好数据库 定义好 ContentProdvider  用 单元测试 来 测试数据  !
 信息全打印在控制台中

l

版权声明:本文为hosterZhu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。