我在查询电话簿联系人时遇到问题.我需要做的是获取同时输入电话和电子邮件或特定类型的联系人列表.
基本上是这样的:
public static final String SELECTION =
"("+ContactsContract.Contacts.HAS_PHONE_NUMBER +"='1') OR " + RawContacts.ACCOUNT_TYPE + "='" + Constants.ACCOUNT_TYPE + "'";
现在的问题是,我与查询一起使用的ContactsContract.Contacts.CONTENT_URI中不存在RawContacts.ACCOUNT_TYPE.我猜我需要加入另一个表,但是不知道如何去做.
有人可以帮我吗?
最佳答案
读取原始联系人及其所有相关数据的最佳方法是使用ContactsContract.RawContacts.Entity目录.如果原始联系人具有数据行,则实体光标将为每个数据行包含一行.如果原始联系人没有数据行,则光标仍将包含一行包含原始联系人级别信息的行.
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI,rawContactId);
Uri entityUri = Uri.withAppendedPath(rawContactUri,Entity.CONTENT_DIRECTORY);
Cursor c = getContentResolver().query(entityUri,new String[]{RawContacts.SOURCE_ID,Entity.DATA_ID,Entity.MIMETYPE,Entity.DATA1},null,null);
try {
while (c.moveToNext()) {
String sourceId = c.getString(0);
if (!c.isNull(1)) {
String mimeType = c.getString(2);
String data = c.getString(3);
//decide here based on mimeType,see comment later
}
}
} finally {
c.close();
}
您将必须根据mimeType过滤结果
例如,如果mimeType为Phone.CONTENT_ITEM_TYPE,则DATA1列存储电话号码,但如果数据类型为Email.CONTENT_ITEM_TYPE,则DATA1存储电子邮件地址.
这样,您将不必直接使用HAS_PHONE_NUMBER,就可以直接遍历所有项目.