在Content Provider中查询数据,需要知道以下信息
- 标识该Content Provider的URI
- 需要查询的数据字段的名称
- 字段中数据的类型
- 如果需要查询特定记录,name还需要知道该记录的ID值
ContentResolver.query()或 Activity.ManagedQuery()方法都可以完成查询功能,这两个方法使用的参数相同,都返回Cursor对象,其区别在于managedQeury()方法是Activity来管理Cursor生命周期。而Query()方法则需要程序员自己管理。
声明方式如下
contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
Uri:用于查询的Content Provider URI值
projection:由需要查询的列名组成的数组
selection:类似SQL中的where子句,用于增加条件来完成数据过滤
selectionArgs:用于替换selection中可以使用?表示的表示的变量值
sortOrder:类似SQL中的 ORDER BY子句,用于实现排序的功能
返回值:Cursor对象,它位于第一条记录之前,或者为null
步骤:
加入权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
- 找出相关的URI
public static Uri uri_raw_contacts = Uri.parse("content://com.android.contacts/raw_contacts");
private static Uri uri_raw_contacts_ = ContactsContract.Contacts.CONTENT_URI; // 和上面等价
public static Uri uri_data = Uri.parse("content://com.android.contacts/data");
public static Uri uri_data_ = ContactsContract.Data.CONTENT_URI;
查询代码
- 查询出raw_contact表中的内容,把_id放到集合中
- 根据查出的_id到data里面查询相关的数据
- 根据data表里mimetype_id取查询数据
- 查询完成后把数据添加到集合中
如:
public static List<Map<String, Object>> queryAllContacts(
ContentResolver resolver) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Cursor c1 = resolver.query(uri_raw_contacts, null, null, null, null);
while (c1.moveToNext()) {
Map<String, Object> map = new HashMap<String, Object>();
int _id = c1.getInt(c1.getColumnIndex("_id"));// 从data表中取出记录的_id编号
map.put("_id", _id);// 存放到map里面
// 查找data表
Cursor c2 = resolver.query(uri_data, new String[] { "data1", "mimetype" }, "raw_contact_id = ?", new String[] { _id + "" }, null); // 通过指定的_id找该联系人的所有数据
while (c2.moveToNext()) {
// 获取名字,电话号码, email
String data1 = c2.getString(c2.getColumnIndex("data1"));
String mimetype = c2.getString(c2.getColumnIndex("mimetype")); //这儿得到的是mimetype的类型是string 而不是int
if (mimetype.equals("vnd.android.cursor.item/name"))// 取出存放的电话号码的名字 这儿取出的类型是是字符串
{
map.put("name", data1);
} else if (mimetype.equals("vnd.android.cursor.item/phone_v2")) {
if (!map.containsKey("phone"))// 第一次放的时候
{
map.put("phone", data1);
} else// 第二次放的时候
{
String p = map.get("phone").toString();
map.put("phone", p + "&&" + data1);
}
} else if (mimetype.equals("vnd.android.cursor.item/email_v2"))// 取出邮件
{
if (!map.containsKey("email"))// 第一次放的时候
{
map.put("email", data1);
} else// 第二次放的时候
{
String p = map.get("email").toString();
map.put("email", p + "&&" + data1);
}
}
}
list.add(map);
}
return list;
}
注意:ContentResolver是在Activity或Fragment里面使用getContentResolver()得到的
添加数据
public static void addContact(ContentResolver contentResolver, MyContacts c) {
// 先向raw_contact里面插入数据
ContentValues values = new ContentValues();
Uri newUri = contentResolver.insert(uri_raw_contacts, values);
// 得到生成的ID
long _id = ContentUris.parseId(newUri);
// 然后用这个ID向data表里面插入数据
values.clear();
values.put("raw_contact_id", _id);
values.put("data1", c.getName());
values.put("data2", c.getName());
// 定义类型
values.put("mimetype", "vnd.android.cursor.item/name");
contentResolver.insert(uri_data, values);
// 插入电话号码
values.clear();
values.put("raw_contact_id", _id);
values.put("data1", c.getPhone());
values.put("mimetype", "vnd.android.cursor.item/phone_v2");
contentResolver.insert(uri_data, values);
// 插入邮箱
values.clear();
values.put("raw_contact_id", _id);
values.put("data1", c.getEmail());
values.put("mimetype", "vnd.android.cursor.item/email_v2");
contentResolver.insert(uri_data, values);
}
修改数据
public static void updateContact(ContentResolver contentResolver, MyContacts c) {
// 先向raw_contact里面插入数据
ContentValues values = new ContentValues();
// 是新录入的数据(只要和名字有关的都要进行修改)
values.put("display_name", c.getName());
values.put("display_name_alt", c.getName());
values.put("sort_key", c.getName());
values.put("sort_key_alt", c.getName());
contentResolver.update(uri_raw_contacts, values, "_id=?", new String[] { c.getId() + "" });
// 修改data表
values.clear();
values.put("data1", c.getName());
values.put("data2", c.getName());
contentResolver.update(uri_data, values, "mimetype = ? and raw_contact_id = ?", new String[] { "vnd.android.cursor.item/name", c.getId() + "" });// 确定正确raw_contact_id,区分类型
// 修改电话号码
values.clear();
values.put("data1", c.getPhone());
// values.put("data2", Phone.TYPE_HOME);
contentResolver.update(uri_data, values,"mimetype = ? and raw_contact_id = ?",new String[] { "vnd.android.cursor.item/phone_v2",c.getId() + "" });// 确定正确raw_contact_id,区分类型
// 修改电话邮箱
values.clear();
values.put("data1", c.getEmail());
// values.put("data2", Email.TYPE_WORK);
contentResolver.update(uri_data, values,"mimetype = ? and raw_contact_id = ?",new String[] { "vnd.android.cursor.item/email_v2",c.getId() + "" });// 确定正确raw_contact_id,区分类型
System.out.println("------------修改成功");
}
读取通话记录
public static Cursor getAllCalls(ContentResolver resolver) {
Uri uri = Uri.parse("content://call_log/calls");
System.out.println(CallLog.Calls.CONTENT_URI);
// 第三个参数和第五个参数的关键字就不用写了
Cursor c = resolver.query(uri, new String[] { "_id", "number", "date",
"duration" }, // 返回指定的列,如果填写null返回该表中所有的列 ,列的信息填写到String[]
null, // where条件的参数"date=?,duration>?"
null, // where条件参数?对应的具体的集合new String[]{"2012-01-01","1*60*1000"}
"date desc" // 排序"date desc"
);
return c;
}
/**
* 根据不同的类型获取电话记录 type:通话类型 (1、来电记录; 2、呼出记录; 3、未接电话)
*
* @return
*/
public static Cursor getCallsType(ContentResolver resolver, int type) {
Uri uri = Uri.parse("content://call_log/calls");
// 第三个参数和第五个参数的关键字就不用写了
Cursor c = resolver.query(uri, new String[] { "_id", "number", "date",
"duration", "type" }, // 返回指定的列,如果填写null返回该表中所有的列 ,列的信息填写到String[]
"type = ?", // where条件的参数"type =?"
new String[] { type + "" }, // where条件参数?对应的具体的集合new String[]{"2"}
"date desc" // 排序"date desc"
);
return c;
}
读取短信
class SMSHelper {
/**
* 查询所有短消息的信息
*
* @param resolver
* @return
*/
public static Cursor getAllMsgs(ContentResolver resolver) {
Uri uri = Uri.parse("content://sms/");
return resolver.query(uri, new String[] { "_id", "address", "body",
"date" }, null, null, "date desc");
}
/**
* 获取thread视图表的数据
*/
public static Cursor getThreadMsgs(ContentResolver resolver) {
// (* from threads --)
Uri uri = Uri.parse("content://sms/");
return resolver.query(uri, new String[] { "* from threads --" }, // 默认写 *就是所有列
null, null, "date desc");
}
/**
* 通过thread_id获取电话号码
*/
public static String getAddressByThread_id(ContentResolver resolver,
int thread_id) {
String address = null;
Uri uri = Uri.parse("content://sms/");
Cursor c = resolver.query(uri, new String[] { "address" },
"thread_id = ?", new String[] { thread_id + "" }, null);
if (c.moveToNext()) {
address = c.getString(c.getColumnIndex("address"));
}
return address;
}
/**
* 查询没有读取短消息的信息
*
* @param resolver
* @return
*/
public static Cursor getUnReadMsgs(ContentResolver resolver) {
Uri uri = Uri.parse("content://sms/");
return resolver.query(uri, new String[] { "_id", "address", "body",
"date" }, "read = ?", new String[] { "0" }, "date desc");
}
}