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

6-19-1 Android应用程序组件:ContentProvider 待整理

2016-07-25 13:56 1776 查看
Android应用程序组件:ContentProvider
ContentProvider:内容提供者,使用CP,可以在一个应用程序中给另一个应用程序
提供私有数据的访问,以达到数据共享的目的。

<1>创建一个ContentProvider:
public class PersonContentProvider extends ContentProvider {
//创建ContentProvider时调用
public boolean onCreate() {
return false;
}
//其它程序通过ContentResolver接口调用query方法时被执行
//在此方法中提供数据查询的操作
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return null;
}
//通过Uri获取该uri对应的数据类型
public String getType(Uri uri) {
return null;
}
//其它程序通过ContentResolver接口调用insert方法时被执行
public Uri insert(Uri uri, ContentValues values) {
return null;
}
//其它程序通过ContentResolver接口调用delete方法时被执行
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
//其它程序通过ContentResolver接口调用update方法时被执行
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
}
<2>在清单文件中注册ContentProvider:
<provider
android:authorities="com.moliying.provider.PersonProvider"
android:name=".PersonContentProvider"/>

authorities:主机名或访问权限(是提供为其它应用程序访问的地址)
name:对应ContentProvider实现类

<3>在其它应用程序中访问这个ContentProvier:
ContentResolver contentResolver = getContentResolver();
contentResolver.query();
contentResolver.insert();
contentResolver.delete();
contentResolver.update();
以上方法来访问ContentProvider中的方法
并提供一个Uri来确定要访问哪个CP
Uri的格式:
content://com.moliying.provider.PersonProvider/路径/...

content://   访问CP的协议
com.moliying.provider.PersonProvider:  要访问的CP主机名
路径:具体在CP中定义的路径格式

实现一个CP,我们要定义好自己的访问路径,添加路径可以使用UriMather工具类:
private static final String AUTHORITY = "com.moliying.provider.PersonProvider";
//用于匹配URI路径的匹配器
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

//Uri的匹配码
private static final int PERSON_CODE = 0X1;
private static final int PERSON_SINGLE_CODE = 0X2;
//自定义的数据类型
private static final String SINGLE_PERSON  = "vnd.android.cursor.item/person";
private static final String MULTIPLE_PERSON  = "vnd.android.cursor.dir/person";
static {
//添加一个URI路径person,如果匹配成功,会返回一个编码:PERSON_CODE
//可以匹配: content://com.moliying.provider.PersonProvider/person
uriMatcher.addURI(AUTHORITY,"person",PERSON_CODE);
//可以匹配: content://com.moliying.provider.PersonProvider/person/#  #通配符只能匹配数字,*通配符可以匹配所有文本
uriMatcher.addURI(AUTHORITY,"person/#",PERSON_SINGLE_CODE);
}

方法的具体实现:
@Override
public boolean onCreate() {
dbHelper = new DatabaseAdapter.DatabaseHelper(getContext());
return true;
}

@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
switch (uriMatcher.match(uri)){
case PERSON_CODE:
SQLiteDatabase db = dbHelper.getReadableDatabase();
return db.query(DBMetadata.Person.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);
case PERSON_SINGLE_CODE:
long id = ContentUris.parseId(uri);
selection = DBMetadata.Person._ID+"=?";
selectionArgs = new String[]{String.valueOf(id)};
db = dbHelper.getReadableDatabase();
return db.query(DBMetadata.Person.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);
}
return null;
}

@Nullable
@Override
public String getType(Uri uri) {
return null;
}

@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
switch (uriMatcher.match(uri)){
case PERSON_CODE:
SQLiteDatabase db = dbHelper.getWritableDatabase();
long id = db.insertOrThrow(DBMetadata.Person.TABLE_NAME,null,values);
uri = ContentUris.withAppendedId(uri,id);
db.close();
return uri;
}
return null;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
switch (uriMatcher.match(uri)){
case PERSON_SINGLE_CODE:
SQLiteDatabase db = dbHelper.getWritableDatabase();
long id = ContentUris.parseId(uri);
selection = DBMetadata.Person._ID + "=?";
selectionArgs = new String[]{String.valueOf(id)};
int row = db.delete(DBMetadata.Person.TABLE_NAME,selection,selectionArgs);
db.close();
return row;
}
return 0;
}

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
switch (uriMatcher.match(uri)){
case PERSON_CODE:
SQLiteDatabase db = dbHelper.getWritableDatabase();
int row = db.update(DBMetadata.Person.TABLE_NAME,values,selection,selectionArgs);
db.close();
return row;
case PERSON_SINGLE_CODE:
db = dbHelper.getWritableDatabase();
long id = ContentUris.parseId(uri);
selection = DBMetadata.Person._ID+"=?";
selectionArgs = new String[]{String.valueOf(id)};
row = db.update(DBMetadata.Person.TABLE_NAME,values,selection,selectionArgs);
db.close();
return row;
}
return 0;
}

在另一个程序的Activity中调用CP:
public void addClick(View view){
ContentResolver cr = getContentResolver();
Uri uri = Uri.parse("content://com.moliying.provider.PersonProvider/person");
ContentValues values = new ContentValues();
values.put(DBMetadata.Person.NAME,"jack");
values.put(DBMetadata.Person.AGE,19);
uri = cr.insert(uri,values);
Toast.makeText(MainActivity.this, uri.toString(), Toast.LENGTH_SHORT).show();
}
public void findByIdClick(View view){
ContentResolver cr = getContentResolver();
Uri uri = Uri.parse("content://com.moliying.provider.PersonProvider/person/1");
Cursor c = cr.query(uri,null,null,null,null);
Person p = null;
if (c.moveToFirst()){
p = new Person(c.getInt(0),c.getString(1),c.getInt(2));
}
Toast.makeText(MainActivity.this, p.toString(), Toast.LENGTH_SHORT).show();
c.close();
}
public void findAllClick(View view){
ContentResolver cr = getContentResolver();
Uri uri = Uri.parse("content://com.moliying.provider.PersonProvider/person");
Cursor c = cr.query(uri,null,null,null,null);
ArrayList<Person> persons = new ArrayList<>();
Person p = null;
while (c.moveToNext()){
p = new Person(c.getInt(0),c.getString(1),c.getInt(2));
persons.add(p);
}
Toast.makeText(MainActivity.this, persons.toString(), Toast.LENGTH_SHORT).show();
c.close();
}
public void updateClick(View view){
ContentResolver cr = getContentResolver();
Uri uri = Uri.parse("content://com.moliying.provider.PersonProvider/person/1");
ContentValues values = new ContentValues();
values.put(DBMetadata.Person.NAME,"tom");
values.put(DBMetadata.Person.AGE,21);
int row = cr.update(uri,values,null,null);
Toast.makeText(MainActivity.this, "更新成功-"+row, Toast.LENGTH_SHORT).show();
}

public void deleteClick(View view){
ContentResolver cr = getContentResolver();
Uri uri = Uri.parse("content://com.moliying.provider.PersonProvider/person/1");
int row = cr.delete(uri,null,null);
Toast.makeText(MainActivity.this, "删除成功-"+row, Toast.LENGTH_SHORT).show();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: