Android心得5.1--第一个内容操作者实例介绍-ContentProvide对外共享数据
2012-08-31 17:56
411 查看
1. 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferencesAPI读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。
当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面方法:
publicclass PersonContentProvider extends ContentProvider{
public boolean onCreate()
public Uri insert(Uri uri, ContentValuesvalues)
public int delete(Uri uri, String selection,String[] selectionArgs)
public int update(Uri uri, ContentValuesvalues, String selection, String[] selectionArgs)
public Cursor query(Uri uri, String[]projection, String selection, String[] selectionArgs, String sortOrder)
public String getType(Uri uri)}
第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider, ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把 ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:
<manifest.... >
<applicationandroid:icon="@drawable/icon" android:label="@string/app_name">
<providerandroid:name=".PersonContentProvider"android:authorities="cn.itcast.provider.personprovider"/>
</application>
</manifest>
注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider(内容提供者)。
2. 部分代码如下:
packagecn.itcast.action;
importcn.itcast.db.utils.DatabaseHelper;
importandroid.content.ContentProvider;
importandroid.content.ContentUris;
importandroid.content.ContentValues;
importandroid.content.UriMatcher;
importandroid.database.Cursor;
importandroid.database.SQLException;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.net.Uri;
importandroid.text.TextUtils;
publicclass PersonContentProvider extends ContentProvider{
//数据集的MIME类型字符串则应该以vnd.android.cursor.dir/开头
public static final String PERSONS_TYPE ="vnd.android.cursor.dir/person";
//单一数据的MIME类型字符串应该以vnd.android.cursor.item/开头
public static final String PERSONS_ITEM_TYPE= "vnd.android.cursor.item/person";
public static final String AUTHORITY ="cn.itcast.provider.personprovider";//主机名
/*自定义匹配码*/
public static final int PERSONS = 1;
/*自定义匹配码*/
public static final int PERSON = 2;
public static final Uri PERSONS_URI =Uri.parse("content://" + AUTHORITY + "/person");
/*这里UriMatcher是用来匹配Uri的类,使用match()方法匹配路径时返回匹配码*/
private static final UriMatcher sMatcher;
static {
sMatcher = newUriMatcher(UriMatcher.NO_MATCH);//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
//如果match()方法匹配content://cn.itcast.provider.personprovider/person路径,返回匹配码为PERSONS
sMatcher.addURI(AUTHORITY,"person", PERSONS);
//如果match()方法匹配content://cn.itcast.provider.personprovider/person/230路径,返回匹配码为PERSON
sMatcher.addURI(AUTHORITY,"person/#", PERSON);
}
private DatabaseHelper databaseHelper;
@Override
public boolean onCreate() {
databaseHelper = newDatabaseHelper(this.getContext());
return true;
}
@Override
public Uri insert(Uri uri, ContentValuesvalues) {
SQLiteDatabase db =databaseHelper.getWritableDatabase();
if (sMatcher.match(uri) != PERSONS) {
throw newIllegalArgumentException("Unknown URI " + uri);
}
long rowId = db.insert("person","personid", values);//往person表添加一条记录
db.close();
if(rowId>0){//如果添加成功
//ContentUris是contentURI的一个辅助类。下面方法负责把rowId和PERSONS_URI连接成一个新的Uri,
//生成的Uri如:content://cn.itcast.provider.personprovider/person/10
returnContentUris.withAppendedId(PERSONS_URI, rowId);
}
throw new SQLException("Failed toinsert row into " + uri);//抛出添加失败信息
}
@Override
public int delete(Uri uri, String selection,String[] selectionArgs) {
SQLiteDatabase db =databaseHelper.getWritableDatabase();
int count = 0;
switch (sMatcher.match(uri)) {
case PERSONS:
count = db.delete("person",selection, selectionArgs);
break;
case PERSON:
//下面的方法用于从URI中解析出id,对这样的路径content://cn.itcast.provider.personprovider/person/10进行解析,返回值为10
long personid =ContentUris.parseId(uri);
String where = "personid="+personid;//删除指定id的记录
where +=!TextUtils.isEmpty(selection) ? " and ("+ selection +")" :"";//把其它条件附加上
count = db.delete("person",where, selectionArgs);
break;
default:
throw new IllegalArgumentException("UnknownURI " + uri);
}
db.close();
return count;
}
@Override
public int update(Uri uri, ContentValuesvalues, String selection, String[] selectionArgs) {
SQLiteDatabase db =databaseHelper.getWritableDatabase();
int count = 0;
switch (sMatcher.match(uri)) {
case PERSONS:
count = db.update("person",values, selection, selectionArgs);
break;
case PERSON:
long personid =ContentUris.parseId(uri);
String where = "personid="+personid;//删除指定id的记录
where += !TextUtils.isEmpty(selection)? " and ("+ selection +")" : "";//把其它条件附加上
count = db.update("person",values, where, selectionArgs);
break;
default:
throw newIllegalArgumentException("Unknown URI " + uri);
}
db.close();
return count;
}
@Override
public Cursor query(Uri uri, String[]projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db =databaseHelper.getReadableDatabase();
Cursor cursor;
switch (sMatcher.match(uri)) {
case PERSONS:
cursor = db.query("person",projection, selection, selectionArgs, null, null, sortOrder);
break;
case PERSON:
long personid =ContentUris.parseId(uri);
String where = "personid="+personid;//删除指定id的记录
where +=!TextUtils.isEmpty(selection) ? " and ("+ selection +")" :"";//把其它条件附加上
cursor = db.query("person",projection, where, selectionArgs, null, null, sortOrder);
break;
default:
throw newIllegalArgumentException("Unknown URI " + uri);
}
cursor.getCount();//在数据库关闭前获取所有数据
db.close();
return cursor;
}
@Override
public String getType(Uri uri) {
switch (sMatcher.match(uri)) {
case PERSONS:
return PERSONS_TYPE;
case PERSON:
return PERSONS_ITEM_TYPE;
default:
throw new IllegalArgumentException("UnknownURI " + uri);
}
}
}
当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面方法:
publicclass PersonContentProvider extends ContentProvider{
public boolean onCreate()
public Uri insert(Uri uri, ContentValuesvalues)
public int delete(Uri uri, String selection,String[] selectionArgs)
public int update(Uri uri, ContentValuesvalues, String selection, String[] selectionArgs)
public Cursor query(Uri uri, String[]projection, String selection, String[] selectionArgs, String sortOrder)
public String getType(Uri uri)}
第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider, ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把 ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:
<manifest.... >
<applicationandroid:icon="@drawable/icon" android:label="@string/app_name">
<providerandroid:name=".PersonContentProvider"android:authorities="cn.itcast.provider.personprovider"/>
</application>
</manifest>
注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider(内容提供者)。
2. 部分代码如下:
packagecn.itcast.action;
importcn.itcast.db.utils.DatabaseHelper;
importandroid.content.ContentProvider;
importandroid.content.ContentUris;
importandroid.content.ContentValues;
importandroid.content.UriMatcher;
importandroid.database.Cursor;
importandroid.database.SQLException;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.net.Uri;
importandroid.text.TextUtils;
publicclass PersonContentProvider extends ContentProvider{
//数据集的MIME类型字符串则应该以vnd.android.cursor.dir/开头
public static final String PERSONS_TYPE ="vnd.android.cursor.dir/person";
//单一数据的MIME类型字符串应该以vnd.android.cursor.item/开头
public static final String PERSONS_ITEM_TYPE= "vnd.android.cursor.item/person";
public static final String AUTHORITY ="cn.itcast.provider.personprovider";//主机名
/*自定义匹配码*/
public static final int PERSONS = 1;
/*自定义匹配码*/
public static final int PERSON = 2;
public static final Uri PERSONS_URI =Uri.parse("content://" + AUTHORITY + "/person");
/*这里UriMatcher是用来匹配Uri的类,使用match()方法匹配路径时返回匹配码*/
private static final UriMatcher sMatcher;
static {
sMatcher = newUriMatcher(UriMatcher.NO_MATCH);//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
//如果match()方法匹配content://cn.itcast.provider.personprovider/person路径,返回匹配码为PERSONS
sMatcher.addURI(AUTHORITY,"person", PERSONS);
//如果match()方法匹配content://cn.itcast.provider.personprovider/person/230路径,返回匹配码为PERSON
sMatcher.addURI(AUTHORITY,"person/#", PERSON);
}
private DatabaseHelper databaseHelper;
@Override
public boolean onCreate() {
databaseHelper = newDatabaseHelper(this.getContext());
return true;
}
@Override
public Uri insert(Uri uri, ContentValuesvalues) {
SQLiteDatabase db =databaseHelper.getWritableDatabase();
if (sMatcher.match(uri) != PERSONS) {
throw newIllegalArgumentException("Unknown URI " + uri);
}
long rowId = db.insert("person","personid", values);//往person表添加一条记录
db.close();
if(rowId>0){//如果添加成功
//ContentUris是contentURI的一个辅助类。下面方法负责把rowId和PERSONS_URI连接成一个新的Uri,
//生成的Uri如:content://cn.itcast.provider.personprovider/person/10
returnContentUris.withAppendedId(PERSONS_URI, rowId);
}
throw new SQLException("Failed toinsert row into " + uri);//抛出添加失败信息
}
@Override
public int delete(Uri uri, String selection,String[] selectionArgs) {
SQLiteDatabase db =databaseHelper.getWritableDatabase();
int count = 0;
switch (sMatcher.match(uri)) {
case PERSONS:
count = db.delete("person",selection, selectionArgs);
break;
case PERSON:
//下面的方法用于从URI中解析出id,对这样的路径content://cn.itcast.provider.personprovider/person/10进行解析,返回值为10
long personid =ContentUris.parseId(uri);
String where = "personid="+personid;//删除指定id的记录
where +=!TextUtils.isEmpty(selection) ? " and ("+ selection +")" :"";//把其它条件附加上
count = db.delete("person",where, selectionArgs);
break;
default:
throw new IllegalArgumentException("UnknownURI " + uri);
}
db.close();
return count;
}
@Override
public int update(Uri uri, ContentValuesvalues, String selection, String[] selectionArgs) {
SQLiteDatabase db =databaseHelper.getWritableDatabase();
int count = 0;
switch (sMatcher.match(uri)) {
case PERSONS:
count = db.update("person",values, selection, selectionArgs);
break;
case PERSON:
long personid =ContentUris.parseId(uri);
String where = "personid="+personid;//删除指定id的记录
where += !TextUtils.isEmpty(selection)? " and ("+ selection +")" : "";//把其它条件附加上
count = db.update("person",values, where, selectionArgs);
break;
default:
throw newIllegalArgumentException("Unknown URI " + uri);
}
db.close();
return count;
}
@Override
public Cursor query(Uri uri, String[]projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db =databaseHelper.getReadableDatabase();
Cursor cursor;
switch (sMatcher.match(uri)) {
case PERSONS:
cursor = db.query("person",projection, selection, selectionArgs, null, null, sortOrder);
break;
case PERSON:
long personid =ContentUris.parseId(uri);
String where = "personid="+personid;//删除指定id的记录
where +=!TextUtils.isEmpty(selection) ? " and ("+ selection +")" :"";//把其它条件附加上
cursor = db.query("person",projection, where, selectionArgs, null, null, sortOrder);
break;
default:
throw newIllegalArgumentException("Unknown URI " + uri);
}
cursor.getCount();//在数据库关闭前获取所有数据
db.close();
return cursor;
}
@Override
public String getType(Uri uri) {
switch (sMatcher.match(uri)) {
case PERSONS:
return PERSONS_TYPE;
case PERSON:
return PERSONS_ITEM_TYPE;
default:
throw new IllegalArgumentException("UnknownURI " + uri);
}
}
}
相关文章推荐
- Android心得5.1--第一个内容操作者实例介绍-ContentProvide对外共享数据
- Android心得--第一个内容操作者实例介绍-ContentProvide对外共享数据
- Android-使用ContentProvide(内容提供者)向其他应用程序共享数据
- Android之 内容提供器(1)——使用内容提供器访问其它程序共享的数据
- Android心得--对ContentProvide分解介绍
- Android学习笔记---20_采用ContentProvider对外共享数据, UriMatcher类使用介绍 ,ContentUris类使用介绍,使用ContentResolver操作Conte
- Android的四大组件之ContentProvider(对外程序共享数据)
- 实例教程九:采用ContentProvider对外共享数据
- Android 使用ContentProvider(内容提供者)共享数据
- 实例教程九:采用ContentProvider对外共享数据
- android面试题:请介绍下ContentProvider是如何实现数据共享的
- [Android实例] Activity之间数据传递与共享的几种途径(bitmap篇)
- Android学习-内容提供器 数据共享
- Python multiprocessing.Manager介绍和实例(进程间共享数据)
- Android之 内容提供器(2)——创建自己的内容提供器将数据共享出去
- android 数据存储和访问方式四:ContentProvider(内容提供者、数据共享)详解
- Android学习第十天—跨程序共享数据(探究内容提供器)
- 使用android中ContentProvider组件对外共享以及监听ContentProvider中数据的变化
- Android之使用Contentprovider对外共享数据和实现数据监听变化
- Android 之使用ContentProvider(内容提供者)共享数据