繁体   English   中英

访问Android联系人所有详细信息的最佳方法

[英]Best way to access all the details of android contacts

我正在编写一个应用程序以将联系方式与服务器同步。 为此,我需要使用内容提供程序多次查询联系人,因为所有数据都不在一个表中。 例如,通过使用联系人ID,我不得不分别查询我认为效率不高的每个联系人的电话,电子邮件和地址表。 如果有人可以向我指出在单个查询中获取所有联系方式的方式,那将非常有帮助。 提前致谢 :)

数据是一个通用表,可以保存任何联系数据

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

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

如果您有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();
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM