ContentProvider共享数据和ContentResolver的使用,Uri,UriMatcher和ContentUris

来源:互联网 发布:费列罗批发价格知乎 编辑:程序博客网 时间:2024/06/06 03:59

 

转载: http://blog.csdn.net/getclass/archive/2010/03/02/5340244.aspx

 

这几天的学习,都是Android很实用的地方.所以练习起来,特别的有精神.今天主要学习的是Android中,统一数据访问的方式,和一些为了方便开 发.由系统提供的一些实用的工具类.如:用于匹配Uri的UriMatcher和获取Uri路径后面ID的ContentUris.这在工作中一定会用到 的,所以要认真的终结.

 

1.使用ContentProvider共享数据 

1)继承 ContentProvider 并重写方法 

ContentProvider创建后就会被调用:public boolean onCreate()

供外部应用往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)

返回当前Url所代 表数据的MIME类型:public String getType(Uri uri)

2)在 AndroidManifest.xml 使用 <provider> 对该 ContentProvider 进行配置 

<provider android:name=".PersonContentProvider" android:authorities="cn.itcast.provider.personprovider"/>

3)使用ContentResolver操作ContentProvider中的数据 

- 添加数据:public Uri insert(Uri uri, ContentValues values)

-删除数据:public int delete(Uri uri, String selection, String[] selectionArgs)

-更新数 据:public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)

-获取数据:public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

总结: 

--ContentProvider共享数据是程序和程 序之间通信用的.

--继承ContentProvider类

--统一了数据访问方式

 

2.Uri 

Uri代表 要操作的数据

content://cn.itcast.provider.personprovider/person/10

-scheme:content://

- 主机名或authority:cn.itcast.provider.personprovider

-路径:/person/10

总结: 

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

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

--要操作 person 表中 id 为 10 的记录的 name 字段, person/10/name

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

--要操作 xxx 表中的记录,可以构建这样的路径 :/xxx

 

3.UriMatcher 

UriMatcher 类用于匹配Uri

UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);

添 加需要匹配uri,如果匹配就会返回匹配 码:sMatcher.addURI(“cn.itcast.provider.personprovider”, “person”, 1);// 

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;

}

总结: 

--常量 UriMatcher.NO_MATCH 表示不匹配任何路径的返回码

--# 号为通配符

 

4.ContentUris 

ContentUris 类用于获取Uri路径后面的ID部分

1)为路径加上ID: withAppendedId(uri, 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

2)从路径中获取ID: parseId(uri) 

Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person/10")

long personid = ContentUris.parseId(uri);

--获取的结果为 :10