Android平台提供了ContentProvider使一个应用程序的指定数据集提供给其他应用程序,其他应用可以通过ContentResolver类从该内容提供者中获取或者存入数据
只有需要在多个应用程序之间共享数据时才需要ContentProvider,譬如我们的应用要操作手机的通讯录,通讯录则需要提供一个内容提供器,它的好处是统一数据访问方式
ContentProvider实现数据共享,ContentProvider用于保存和获取数据,并使其对所有应用程序可见,这是不同程序之间共享数据的唯一方法,因为Android没有提供所有应用共同访问的公共存储区
开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentProvider对象实现对ContentProvider的操作,或者通过ContentObserver来监控别的应用提供的ContentProvider,除非你的应用需要共享数据给其他应用
ContentProvider使用URI来唯一标识数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。
既然ContentProvider的作用暴露自己的数据给其他应用,那么就需要提供一系列操作的方法来供对方调用
自定义一个类去继承ContentProvider,然后实现其内部方法
public boolean onCreate()
该方法在ContentProvider创建后会被调用,当其他应用第一次访问ContentProvider时,该ContentProvider会被创建出来,并立即回调该onCreate()方法。
我们常在这个方法中创建要暴露的数据库或者SharedPreferences
public Uri inert(Uri uri,ContentValues values)
根据该Uri插入values对应的数据。
在这个方法中定义对暴露数据库或者SP的插入操作
public int delete(Uri uri,String selection,String[] selectionArgs)
根据Uri删除select条件所匹配的全部记录。
在这个方法中定义对暴露数据库或者SP的删除操作
public int update(Uri uri,ContentValues values ,String selection,String[] selectionArgs)
根据Uri修改select条件所匹配的全部记录
在这个方法中定义对暴露数据库或者SP的更新操作
public Cursor query(Uri uri ,String[] projection,String selection ,String[] selectionArgs,String sortOrder)
根据Uri查询出select条件所匹配的全部记录,其中projection就是列明列表,表明只选择出指定的数据列。
在这个方法中定义对暴露数据库或者SP的查询操作
public String getTypt(Uri uri)
该方法用于返回当前Uri所代表的数据的MIME类型,如果该Uri对应数据可能包括多条数据,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,如果该Uri对应的数据只包含一条记录,那么返回MIME类型字符串应该以vnd.android.cursor.item/开头。
示例代码:
MyContentProvider.java
/**
* 自定义ContentProvider
*
* @author lixyz
*
*/
public class MyContentProvider extends ContentProvider {
private SQLiteOpenHelper dataHelper;
private SQLiteDatabase database;
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
long newPerson = database.insert("person", null, values);
Uri returnUri = Uri.parse(String.valueOf(newPerson));
return returnUri;
}
@Override
public boolean onCreate() {
dataHelper = new MyDataHelper(getContext(), "person.db", null, 1);
database = dataHelper.getWritableDatabase();
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor = database.query("person", null, selection, selectionArgs, null, null, sortOrder);
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
// 数据库操作
class MyDataHelper extends SQLiteOpenHelper {
public static final String SQL = "create table if not exists person(_id integer primary key autoincrement ,name text,age integer)";
public MyDataHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL);
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
}
}
}