l
使用
ContentProvider
(内容提供者)共享数据
使用
ContentProvider
(内容提供者)共享数据
l
Uri
介绍
Uri
介绍
Uri
代表了要操作的数据
,
Uri
主要包含了两部分信息:
1
》需要操作的
ContentProvider
,
2
》对
ContentProvider
中
的什么数据进行操作,一个
Uri
由以下几部分组成:
代表了要操作的数据
,
Uri
主要包含了两部分信息:
1
》需要操作的
ContentProvider
,
2
》对
ContentProvider
中
的什么数据进行操作,一个
Uri
由以下几部分组成:
ContentProvider
(内容提供者)的
scheme
已经由
Android
所规定,
scheme
为:
content://
(内容提供者)的
scheme
已经由
Android
所规定,
scheme
为:
content://
主机名(或叫
Authority
)用于唯一标识这个
ContentProvider
,外部调用者可以根据这个标识来找到它。
Authority
)用于唯一标识这个
ContentProvider
,外部调用者可以根据这个标识来找到它。
路径(
path
)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下
:
path
)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下
:
要操作
person
表中
id
为
10
的记录,可以构建这样的路径
:/person/10
person
表中
id
为
10
的记录,可以构建这样的路径
:/person/10
要操作
person
表中
id
为
10
的记录的
name
字段,
person/10/name
person
表中
id
为
10
的记录的
name
字段,
person/10/name
要操作
person
表中的所有记录,可以构建这样的路径
:/person
person
表中的所有记录,可以构建这样的路径
:/person
要操作
xxx
表中的记录,可以构建这样的路径
:/xxx
xxx
表中的记录,可以构建这样的路径
:/xxx
当然要操作的数据不一定来自数据库,也可以是文件、
xml
或网络等其他存储方式,如下
:
xml
或网络等其他存储方式,如下
:
要操作
xml
文件中
person
节点下的
name
节点,可以构建这样的路径:
/person/name
xml
文件中
person
节点下的
name
节点,可以构建这样的路径:
/person/name
如果要把一个字符串转换成
Uri
,可以使用
Uri
类中的
parse()
方法,如下:
Uri
,可以使用
Uri
类中的
parse()
方法,如下:
Uri uri = Uri.parse(“content://cn.itcast.provider.personprovider/person”)
l
UriMatcher
类使用介绍
UriMatcher
类使用介绍
因为
Uri
代表了要操作的数据,所以我们经常需要解析
Uri
,并从
Uri
中获取数据。
Android
系统提供了两个用于操作
Uri
的工具类,分别为
UriMatcher
和
ContentUris
。掌握它们的使用,会便于我们的开发工作。
Uri
代表了要操作的数据,所以我们经常需要解析
Uri
,并从
Uri
中获取数据。
Android
系统提供了两个用于操作
Uri
的工具类,分别为
UriMatcher
和
ContentUris
。掌握它们的使用,会便于我们的开发工作。
UriMatcher
类用于匹配
Uri
,它的用法如下:
类用于匹配
Uri
,它的用法如下:
首先第一步把你需要匹配
Uri
路径全部给注册上,如下:
Uri
路径全部给注册上,如下:
//
常量
UriMatcher.NO_MATCH
表示不匹配任何路径的返回码
常量
UriMatcher.NO_MATCH
表示不匹配任何路径的返回码
UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//
如果
match()
方法匹配
content://cn.itcast.provider.personprovider/person
路径,返回匹配码为
1
如果
match()
方法匹配
content://cn.itcast.provider.personprovider/person
路径,返回匹配码为
1
sMatcher.addURI(
“
cn.itcast.provider.personprovider
”
,
“
person
”
, 1);//
添加需要匹配
uri
,如果匹配就会返回匹配码
“
cn.itcast.provider.personprovider
”
,
“
person
”
, 1);//
添加需要匹配
uri
,如果匹配就会返回匹配码
//
如果
match()
方法匹配
content://cn.itcast.provider.personprovider/person/230
路径,返回匹配码为
2
如果
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”
)
)) {
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
Uri
后,就可以使用
sMatcher.match(uri)
方法对输入的
Uri
进行匹配,如果匹配就返回匹配码,
匹配码是调用
addURI()
方法传入的第三个参数,假设匹配
content://cn.itcast.provider.personprovider/person
路径,返回的匹配码为
1
l
ContentUris
类使用介绍
ContentUris
类使用介绍
ContentUris
类用于获取
Uri
路径后面的
ID
部分,它有两个比较实用的方法:
类用于获取
Uri
路径后面的
ID
部分,它有两个比较实用的方法:
withAppendedId(uri, id)
用于为路径加上
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
生成后的
Uri
为:
content://cn.itcast.provider.personprovider/person/10
parseId(uri)
方法用于从路径中获取
ID
部分:
方法用于从路径中获取
ID
部分:
Uri uri = Uri.parse(“content://cn.itcast.provider.personprovider/person/10”)
long personid = ContentUris.parseId(uri);//
获取的结果为
:10
获取的结果为
:10
l
使用
ContentProvider
共享数据
使用
ContentProvider
共享数据
ContentProvider
类主要方法的作用:
类主要方法的作用:
public boolean onCreate()
该方法在
ContentProvider
创建后就会被调用,
Android
开机后,
ContentProvider
在其它应用第一次访问它时才
会被创建。
ContentProvider
创建后就会被调用,
Android
开机后,
ContentProvider
在其它应用第一次访问它时才
会被创建。
public Uri insert(Uri uri, ContentValues values)
该方法用于供外部应用往
ContentProvider
添加数据。
ContentProvider
添加数据。
public int delete(Uri uri, String selection, String[] selectionArgs)
该方法用于供外部应用从
ContentProvider
删除数据。
ContentProvider
删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
该方法用于供外部应用更新
ContentProvider
中的数据。
ContentProvider
中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
该方法用于供外部应用从
ContentProvider
中获取数据。
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
”
。
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
”
。
ContentResolver
操作
ContentProvider
中数据
当外部应用需要对
ContentProvider
中的数据进行添加、删除、修改和查询操作时,可以使用
ContentResolver
类
来完成,要获取
ContentResolver
对象,可以使用
Activity
提供的
getContentResolver()
方法。
ContentResolver
类提供了与
ContentProvider
类相同签名的四个方法:
ContentProvider
中的数据进行添加、删除、修改和查询操作时,可以使用
ContentResolver
类
来完成,要获取
ContentResolver
对象,可以使用
Activity
提供的
getContentResolver()
方法。
ContentResolver
类提供了与
ContentProvider
类相同签名的四个方法:
public Uri insert(Uri uri, ContentValues values)
该方法用于往
ContentProvider
添加数据。
ContentProvider
添加数据。
public int delete(Uri uri, String selection, String[] selectionArgs)
该方法用于从
ContentProvider
删除数据。
ContentProvider
删除数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
该方法用于更新
ContentProvider
中的数据。
ContentProvider
中的数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
该方法用于从
ContentProvider
中获取数据。
ContentProvider
中获取数据。
这些方法的第一个参数为
Uri
,代表要操作的
ContentProvider
和对其中的什么数据进行操作,假设给定的是:
Uri.parse(“content://cn.itcast.providers.personprovider/person/10”)
,那么将会对主机名为
cn.itcast.providers.personprovider
的
ContentProvider
进行操作,操作的数据为
person
表中
id
为
10
的记录。
Uri
,代表要操作的
ContentProvider
和对其中的什么数据进行操作,假设给定的是:
Uri.parse(“content://cn.itcast.providers.personprovider/person/10”)
,那么将会对主机名为
cn.itcast.providers.personprovider
的
ContentProvider
进行操作,操作的数据为
person
表中
id
为
10
的记录。
使用
ContentResolver
对
ContentProvider
中的数据进行添加、删除、修改和查询操作:
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
表中所有记录
获取
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
把
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
的记录
删除
id
为
2
的记录
Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
resolver.delete(deleteIdUri, null, null);
这是另外一个项目 测试得类
先运行好数据库 定义好 ContentProdvider 用 单元测试 来 测试数据 !
信息全打印在控制台中
版权声明:本文为hosterZhu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。