访问 android 联系人所有详细信息的最佳方式

Posted

技术标签:

【中文标题】访问 android 联系人所有详细信息的最佳方式【英文标题】:Best way to access all the details of android contacts 【发布时间】:2012-01-20 09:00:31 【问题描述】:

我正在编写一个应用程序来与我的服务器同步联系人详细信息。为此,我需要使用内容提供者多次查询联系人,因为所有数据都不存在于一张表中。例如,通过使用联系人 ID,我必须为每个联系人分别查询电话、电子邮件和地址表,我觉得效率不高。如果有人能指出我在单个查询中获取所有联系方式的方法,那将非常有帮助。在此先感谢:)

【问题讨论】:

【参考方案1】:

如果您有 rawContactId,则不需要多个查询。您可以使用 Data.CONTENT_URI 作为 uri 并在 rawContactId 上进行选择来进行单个查询。

您必须使用生成的光标循环才能读取信息。要知道您需要查看数据表中给定行的哪一列,您需要检查 MIMETYPE

编辑

private interface DataQuery 
    public static final String[] PROJECTION = new String[]  Data._ID, Data.MIMETYPE, Data.DATA1, Data.DATA2, Data.DATA3, ;

    public static final int COLUMN_ID = 0;
    public static final int COLUMN_MIMETYPE = 1;
    public static final int COLUMN_DATA1 = 2;
    public static final int COLUMN_DATA2 = 3;
    public static final int COLUMN_DATA3 = 4;
    public static final int COLUMN_PHONE_NUMBER = COLUMN_DATA1;
    public static final int COLUMN_PHONE_TYPE = COLUMN_DATA2;
    public static final int COLUMN_GIVEN_NAME = COLUMN_DATA2;
    public static final int COLUMN_FAMILY_NAME = COLUMN_DATA3;

    public static final String SELECTION = Data.RAW_CONTACT_ID + "=?";



final Cursor c = resolver.query(Data.CONTENT_URI, DataQuery.PROJECTION, DataQuery.SELECTION, new String[]  String.valueOf(rawContactId) , null);

try 
    while (c.moveToNext()) 
        final long id = c.getLong(DataQuery.COLUMN_ID);
        final String mimeType = c.getString(DataQuery.COLUMN_MIMETYPE);
        uri = ContentUris.withAppendedId(Data.CONTENT_URI, id);

        if (mimeType.equals(StructuredName.CONTENT_ITEM_TYPE)) 
            final String oldLastName = c.getString(DataQuery.COLUMN_FAMILY_NAME);
            final String oldFirstName = c.getString(DataQuery.COLUMN_GIVEN_NAME);
            //store them where you need
         else if (mimeType.equals(Phone.CONTENT_ITEM_TYPE)) 
            final int type = c.getInt(DataQuery.COLUMN_PHONE_TYPE);
            final String cellPhone = c.getString(DataQuery.COLUMN_PHONE_NUMBEIR);
            //store them where you need
            
        
     // while
 finally 
    if (c!=null) c.close();

请考虑我没有检查代码:我这里没有编译器。我希望它无论如何都会有用

【讨论】:

嗨赫歇尔。谢谢回复。您的意思是说我可以使用 Data.CONTENT_URI 在单个查询中获取电子邮件、电话、地址吗?如果可以,请您进一步解释一下如何做到这一点?再次感谢:)【参考方案2】:

Data 是一个通用表,可以保存任何类型的联系人数据

存储在给定行中的数据类型由该行的 MIMETYPE 值指定,该值确定通用列 DATA1 到 DATA15 的含义。

例如,如果数据类型是 Phone.CONTENT_ITEM_TYPE,则 DATA1 列存储电话号码,但如果数据类型是 Email.CONTENT_ITEM_TYPE,则 DATA1 列存储电子邮件地址。同步适配器和应用程序可以引入它们自己的数据类型。

【讨论】:

以上是关于访问 android 联系人所有详细信息的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

Android:在 Contact Uri 列表中显示所有有电话号码的联系人详细信息

检索特定联系人的所有详细信息

在 Android 中的联系人详细信息上显示应用程序图标

在 Android 中获得不同联系人的最佳方式是啥

以编程方式(Kotlin)在Android中修改和显示联系人的最佳方式?

如何一次查询联系人的所有详细信息