我正在编写一个应用程序来与我的服务器同步联系人详细信息。为此,我需要多次使用内容提供程序查询联系人,因为一个表中不存在所有数据。例如,通过使用联系人ID,我必须单独查询每个联系人的电话,电子邮件和地址表,我觉得效率不高。如果有人能指出我在单个查询中获取所有联系人详细信息的方法,那将非常有用。在此先感谢:)
答案 0 :(得分:0)
Data是一个通用表,可以存储任何类型的联系人数据。
存储在给定行中的数据类型由行的MIMETYPE值指定,该值确定通用列DATA1到DATA15的含义。
例如,如果数据类型为Phone.CONTENT_ITEM_TYPE,则DATA1列存储电话号码,但如果数据类型为Email.CONTENT_ITEM_TYPE,则DATA1存储电子邮件地址。同步适配器和应用程序可以引入自己的数据种类。
答案 1 :(得分:0)
如果您有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();
}
请考虑我没有检查代码:我这里没有编译器。我希望无论如何它都会有用