您的位置:首页 > 移动开发 > Android开发

Android四大组件之ContentProvider

2014-04-08 21:57 381 查看
ContentProvider--内容提供者,其是应用程序之间共享数据的接口。这个数据可以存储在数据库,文件等地方。ContentProvider只是为其他应用程序提供一个公共的接口,方便其他应用程序调用数据。ContentProvider有点类似一座桥,其共享的数据就是一座岛,外部人员想要去参观这个岛,那么必须通过ContentProvider这个桥。

在介绍ContentProvider之前,必须先介绍一下URI:(来自网络)

URI(统一资源标识符)的使用方法

为系统的每一个资源给其一个名字,比方说通话记录。

1、每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。

2、Android所提供的ContentProvider都存放在android.provider包中。 将其分为A,B,C,D
4个部分:



A:标准前缀,用来说明一个Content
Provider控制这些数据,无法改变的;"content://"

B:URI 的标识,它定义了是哪个Content
Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的 类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称;"content://hx.android.text.myprovider"

C:路径,不知道是不是路径,通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一致就ok了;"content://hx.android.text.myprovider/tablename"

D:如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部;"content://hx.android.text.myprovider/tablename/#"
#表示数据id
在写ContentProvider子类的时候,首先需要在ContentProvider子类中使用UriMatcher类,这个类可以用来注册ContentProvider存储对象的URI地址,这个地址在外部应用程序访问ContentProvider子类对象的时候,可以根据在ContentProvider子类里面注册的URI来返回对应的匹配码,具体的注册URI的方向如下;
/常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://cn.xxt.provider.personprovider/person路径,返回匹配码为1
sMatcher.addURI(“cn.xxt.provider.personprovider”, “person”, 1);//添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配content://cn.xxt.provider.personprovider/person/230路径,返回匹配码为2
sMatcher.addURI(“cn.xxt.provider.personprovider”, “person/#”, 2);//#号为通配符


在注册完成URI后,就需要在ContentProvider的子类实现一系列的操作数据的方法(借用SQLiteOpenHelper来实现相关操作)

public class Ser extends ContentProvider{
public static final UriMatcher uriMatcher;
static { //静态块,首先注册URI
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(Students.AUTHORITY, "item", 1); //注册URI
uriMatcher.addURI(Students.AUTHORITY, "item/#", 2);
}
@Override
public boolean onCreate() {
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
}
代码写完后,还需要在Manifest.xml文件中注册,四大组件都需要注册的。具体XML代码如下:
<provider
android:name=".Ser "
android:authorities="com.example.provider.students"
/>
在完成ContentProvider类后,我们需要在程序中获取ContentProvider所提供的数据。这里就需要使用到contentResolver这个对象,在程序中使用getContentResolver方法来获取contentResolver对象,然后可以通过我们在ContentProvider子类中注册的URI来访问我们在ContentProvider子类中定义的对数据的一系列操作了。

ContentProvider的介绍基本结束,梳理一下整个过程;

(1)首先我们使用SQLiteOpenHelper的子类来完成数据库的创建和一系列的操作。

(2)然后再创建ContentProvider的子类,这个类中我们首先使用uriMatcher对象来注册我们数据的URI以及借助SQLiteOpenHelper子类中的操作数据库的方法来实现ContentProvider子类的相关操作方法。并在Manifest.xml中注册这个ContentProvider对象。至此,我们就把通过SQLiteOpenHelper子类创建的数据库对象通过ContentProvider子类暴露出去了。

(3)最后我们需要在应用程序中操作第一步中创建的数据库的数据。使用getContentResolver来获取一个ContentResolver对象,然后这个对象中有一系列操作数据的方法,我们通过调用这些方法并传递正确的URI来完成对数据操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: