在android中,使用ContentProvider的场景比较多,比如:获取联系人,获取手机软件安装目录 ...andr more..
ContentProvider可以比作中间人,更形象的说:A想要用C的数据,但是A没有通道,而B恰好有,所以B就提供了这样一个桥梁,让A可以通过B来和C进行数据的传递和沟通;如果A要使用B的桥梁,那就需要在一个大家都知道的地方放置,所以需要在AndroidManifest.xml配置通信地址"android:authorities"。
下面就开始使用自定义的内容提供者,首先创建自定义的数据库
public class Helper extends SQLiteOpenHelper {
public static final String TABNAME = "book";
public static final String ID = "_id";
public static final String NAME = "name";
public Helper(Context context) {
super(context, "cp.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(" CREATE TABLE " + TABNAME + " (" + ID
+ " integer primary key autoincrement," + NAME + " TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
然后创建内容提供者,也就是中间人(ContentProvicerLogic)让它继承自ContentProvider
public class ContentProvicerLogic extends ContentProvider {
private Helper helper;
// 匹配URL
private static final UriMatcher uri_matcher;
// 匹配code
private static final int INSERT = 1;
private static final int QUERY = 2;
private static final int QUERYNE = 5;
private static final int DELETE = 3;
private static final int UPDATE = 4;
//主机地址 类似于通信信号道
private static final String URL = "com.example.contentproviderdemo";
static {
uri_matcher = new UriMatcher(UriMatcher.NO_MATCH);
uri_matcher.addURI(URL, "insert", INSERT);
uri_matcher.addURI(URL, "query", QUERY);
uri_matcher.addURI(URL, "queryne", QUERYNE);
uri_matcher.addURI(URL, "delete", DELETE);
uri_matcher.addURI(URL, "update", UPDATE);
}
//TODO 在初始化时创建数据库实例
@Override
public boolean onCreate() {
helper = new Helper(getContext());
return false;
}
//TODO
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor cursor;
if (uri_matcher.match(uri) == QUERY) {
SQLiteDatabase database = helper.getReadableDatabase();
cursor = database.query(helper.TABNAME, projection, selection,
selectionArgs, null, null, null);
} else if (uri_matcher.match(uri) == QUERYNE) {
long id = ContentUris.parseId(uri);
SQLiteDatabase database = helper.getReadableDatabase();
cursor = database.query(helper.TABNAME, projection, "id=?",
new String[] { id + "" }, null, null, sortOrder);
} else {
throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
}
return cursor;
}
//TODO 一定要覆写这个方法
@Override
public String getType(Uri uri) {
if (uri_matcher.match(uri) == QUERY) {
return "vnd.android.cursor.dir/cps";
} else if (uri_matcher.match(uri) == QUERYNE) {
return "vnd.android.cursor.item";
}
return null;
}
//TODO 增加类容
@Override
public Uri insert(Uri uri, ContentValues values) {
if (uri_matcher.match(uri) == INSERT) {
SQLiteDatabase database = helper.getWritableDatabase();
long id = database.insert(helper.TABNAME, null, values);
} else {
throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
}
return null;
}
//TODO 删除指定条件的类容
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
long id;
if (uri_matcher.match(uri) == DELETE) {
SQLiteDatabase database = helper.getWritableDatabase();
id = database.delete(helper.TABNAME, selection, selectionArgs);
} else {
throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
}
return (int) id;
}
//TODO 根据条件更新指定的类容
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
long id;
if (uri_matcher.match(uri) == UPDATE) {
SQLiteDatabase database = helper.getWritableDatabase();
id = database.update(helper.TABNAME, values, selection,
selectionArgs);
} else {
throw new IllegalArgumentException("路径不匹配,不能执行查询操作");
}
return (int) id;
}
}
细心留意发现上面代码有个共同的URL,这个URL地址就是A根C通信的桥梁,所以需要再清单文件中注册
<provider
android:name="com.example.contentproviderdemo.ContentProvicerLogic"
android:authorities="com.example.contentproviderdemo" >
</provider>
最后在调用时,只需要根据一定的规则传入数据既可
@Override
public void onClick(View v) {
ContentResolver contentResolver = getContentResolver();
switch (v.getId()) {
case R.id.button1:
Uri searchuri = Uri
.parse("content://com.example.contentproviderdemo/query");
Cursor cursor = contentResolver.query(searchuri, null, null, null,
null);
while (cursor.moveToNext()) {
Log.i("MyTag", cursor.getString(cursor.getColumnIndex("name")));
}
cursor.close();
break;
case R.id.button2:
Uri adduri = Uri
.parse("content://com.example.contentproviderdemo/insert");
ContentValues values = new ContentValues();
values.put("name", "fuck");
contentResolver.insert(adduri, values);
break;
case R.id.button3:
Uri updateuri = Uri
.parse("content://com.example.contentproviderdemo/update");
ContentValues values2 = new ContentValues();
values2.put("name", "fuck2");
contentResolver.update(updateuri, values2, "name=?",
new String[] { "fuck" });
break;
case R.id.button4:
Uri deleteuri = Uri
.parse("content://com.example.contentproviderdemo/delete");
contentResolver
.delete(deleteuri, "name=?", new String[] { "fuck" });
break;
}
}