使用ContentProvider是通过Android组件都具有的ContentResolver对象,通过Uri进行数据操作。程序开发人员只需要知道Uri和数据集的数据格式,则可以进行数据操作,解决不同应用程序间的数据共享问题。
每个Android组件都具有一个ContentResolver对象,获取ContentResolver对象的方法是调用getContentResolver()方法。
代码清单7-53 获取ContentResolver对象
ContentResolver resolver = getContentResolver();
1.查询操作
在获取到ContentResolver对象后,程序开发人员则可以使用query()方法查询目标数据。代码清单7-54所示的代码是查询ID为2的数据。
代码清单7-54 获取ContentResolver对象
String KEY_ID = "_id";
String KEY_NAME = "name";
String KEY_AGE = "age";
String KEY_HEIGHT = "height";
Uri uri = Uri.parse(CONTENT_URI_STRING + "/" + "2";
Cursor cursor = resolver.query(uri,
new String[] {KEY_ID, KEY_NAME, KEY_AGE, KEY_HEIGHT},
null, null, null);
在Uri中定义了需要查询数据的ID,在query()方法并没有额外声明查询条件。
如果需要获取数据集中的全部数据,则可直接使用CONTENT_URI,此时ContentProvider在分析Uri时将认为需要返回全部数据。ContentResolver的query()方法与SQLite数据库的query()方法非常相似,语法结构如代码清单7-55所示。
代码清单7-55 ContentResolver的query()方法语法
Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder)
其中,uri定义了查询的数据集;projection定义了从数据集返回哪些数据项;selection定义了返回数据的查询条件;selectionArgs是对应的实际查询条件;sortOrder是排序方式。
2.添加操作
向ContentProvider中添加数据有两种方法:一种是使用insert()方法,向ContentProvider中添加一条数据;另一种是使用bultInsert()方法,批量地添加数据。
代码清单7-56所示的代码说明了如何使用insert()方法添加单条数据。
代码清单7-56 使用insert()方法添加单条数据
ContentValues values = new ContentValues();
values.put(KEY_NAME, "Tom");
values.put(KEY_AGE, 21);
values.put(KEY_HEIGHT, );
Uri newUri = resolver.insert(CONTENT_URI, values);
代码清单7-57所示的代码说明了如何使用bultInsert()方法添加多条数据。
代码清单7-57 使用bultInsert()方法添加多条数据
ContentValues[] arrayValues = new ContentValues[10];
//实例化每一个ContentValues
int count = resolver.bultInsert(CONTENT_URI, arrayValues);
3.删除操作
删除操作需要使用delete()方法。如果需要删除单条数据,则可以在Uri中指定需要删除数据的ID;如果需要删除多条数据,则可以在selection中声明删除条件。
代码清单7-58所示的代码说明了如何删除ID为2的数据。
代码清单7-58 删除ID为2的数据
Uri uri = Uri.parse(CONTENT_URI_STRING + "/" + "2");
int result = resolver.delete(uri, null, null);
也可以在selection中将删除条件定义为ID大于4的数据,如代码清单7-59所示。
代码清单7-59 删除条件定义为ID大于4的数据
String selection = KEY_ID + “>4”;
int result = resolver.delete(CONTENT_URI, selection, null);
4.更新操作
更新操作需要使用update()方法,参数定义与delete()方法相同,同样可以在Uri中指定需要更新数据的ID,也可以在selection中声明更新条件。
代码清单7-60所示的代码说明了如何更新ID为7的数据。
代码清单7-60 更新ID为7的数据
ContentValues values = new ContentValues();
values.put(KEY_NAME, "Tom");
values.put(KEY_AGE, 21);
values.put(KEY_HEIGHT, );
Uri uri = Uri.parse(CONTENT_URI_STRING + "/" + "7");
int result = resolver.update(uri, values, null, null);