2010-06-23 65 views
3

我在查询电话簿联系人时遇到问题。我需要做的是获得一个既有电话又有电子邮件的联系人列表,或者是特定类型的联系人列表。Android联系人查询

基本上是这样的:

public static final String SELECTION = 
    "("+ContactsContract.Contacts.HAS_PHONE_NUMBER +"='1') OR " + RawContacts.ACCOUNT_TYPE + "='" + Constants.ACCOUNT_TYPE + "'"; 

现在的问题是,RawContacts.ACCOUNT_TYPE不会在ContactsContract.Contacts.CONTENT_URI,我与我的查询中使用存在。我猜我需要加入另一张桌子,但不知道如何去做。

任何人都可以在这里帮我,好吗?

回答

2

读取原始联系人以及与其关联的所有数据的最佳方式是使用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, 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,因为您将直接迭代通过项目。

1

也许因为它包含了"vnd.android.cursor.item/email_v2" MIME类型的所有数据记录,与相关原料接触总联系人数据结合你应该使用Email.CONTENT_URI

+0

嗯......如果我使用上面的URI has_phone_number字段是未知的...... – Bostjan 2010-06-23 10:03:31