Android进阶高手(一)可怕的ContentProvider

来源:互联网 发布:max30100中文数据手册 编辑:程序博客网 时间:2024/05/21 01:55

在Android系统中有很多应用都通过ContentProvider来对外共享数据,比如联系人。联系人的数据是存放在数据库中的,如果它不采用ContentProvider的话,别的应用要访问它的数据,它就需要把数据库对外共享,那么别的应用就需要了解它的数据结构,才能进行相应的操作,那样就不便于对外共享数据。如果它采用了ContentProvider共享数据,别的应用就可以运用ContentProvider的API操作联系人里的数据。ContentProvider在这里就扮演一个共享数据的角色,其他的应用可以通过统一的API访问数据。

一个应用要通过ContentProvider对外共享数据时,需要哪些步骤呢?

第一、需要继承ContentProvider并重写一下方法:

public boolean onCreate() {}

public int delete(Uri uri, String selection, String[] selectionArgs) {}

public Uri insert(Uri uri, ContentValues values) {}

public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {}

public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {}

public String getType(Uri uri) {}

大家可能注意到了,以上重写的各个方法中的第一个参数都是Uri,这个参数有什么作用呢?

一个Uri由以下几部分组成:content://com.taisi.providers.personprovider/person/2

1、scheme:标准前缀表明这个数据被一个内容提供器控制,它不会被修改,就是上面的content://部分

2、author:Uri的权限部分,它标识这个内容提供器。对于第三方应用程序,这应该是一个全称类名(小写),以确保唯一性。对应上面就是com.taisi.providers.personprovider这部分。

3、Path:用来判断请求数据类型的路径,这个可以是0或多个字长。对应上面的就是/person/2

 

那么我们怎么把一个字符串转化成Uri呢?可以通过使用Uri类中的parse()方法,如下:

Uri uri=Uri.parse("content://com.taisi.providers.personprovider/person");

 

第二、需要在AndroidMainifest.xml中进行配置,为了让其他应用能找到该ContentProvider,ContentProvider采用了authorities(域名)对它进行唯一标识,你可以把ContentProvider看做是一个网站,authorities就是它的域名:

<application android:icon="@drawable/icon" android:label="@string/app_name">
        <provider android:name=".PersonProvider" android:authorities="com.taisi.providers.personprovider" />   

 </application>

介绍完上面的东西后,我们还有必要了解下下面的两个工具类

1、UriMatcher类使用介绍

如果我们把Uri传递过去,但是如何解析呢?这就使用到UriMatcher类这个工具了。使用UriMatcher匹配Uri,步骤如下:

(1)、UriMatcher sMatcher=new UriMatcher(UriMatcher.NO_MATCH),常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码。

(2)、sMatcher.addURI("com.taisi.providers.personprovider","person",1);

如果Uri匹配content://com.taisi.providers.personprovider/person,那么返回匹配码1.

(3)、sMatcher.addURI("com.taisi.providers.personprovider","person/#",2);

如果Uri匹配content://com.taisi.providers.personprovider/person/#,那么匹配码返回码2.

2、ContentUris类使用介绍

另一个辅助工具类ContentUris用于获取Uri路径后面的ID部分,它有两个有用的方法:

(1)、withAppendedId(uri,id)用于为路径加上ID部分。

Uri uri=Uri.parse("content://com.taisi.providers.personprovider/person")

Uri resultUri=ContentUris.withAppendedId(uri,10);

生成后的Uri为content://com.taisi.providers.personprovider/person/10

(2)、parseId(uri)方法用于从路径中获取ID部分

Uri uri=Uri.parse("content://com.taisi.providers.personprovider/person/10")

long personid=ContentUris.parseId(uri)

获取的结果为10.

 

好,说了这么多了,没有实例的话,就是屁话,呵呵。废话不多说了。直接上项目代码如下:http://dl5.csdn.net/fd.php?i=294837943967154&s=906cb907de2fa48dde2539db3bb4cbf2

原创粉丝点击