如何加入具有不同 CONTENT_ITEM_TYPE 但共享公共字段 RAW_CONTACT_ID 的记录?
How can I join records with different CONTENT_ITEM_TYPE but that share a common field, namely RAW_CONTACT_ID?
我需要 Cursor
选择属于按姓氏排序的特定组的联系人(而不是 display_names)。
很容易让一个游标返回属于所请求组的联系人,另一个返回按姓氏排序的联系人。
然而,姓氏属于 ContactsContract.Data.MIMETYPE = ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE
的 DATA 记录,而属于特定组的联系人将在 ContactsContract.Data.MIMETYPE = ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE
.
的记录中找到
如何加入具有不同 CONTENT_ITEM_TYPE 但共享公共字段 RAW_CONTACT_ID
的记录?
你说你需要 select 个联系人,如果是这样你不应该使用 RAW_CONTACT_ID,而是 CONTACT_ID 加入你的联系人数据。
单个联系人可能是多个 RawContact 的集合,在这种情况下,我假设您希望将单个联系人的所有详细信息作为一行。
现在要得到你想要的东西,你不能使用 Cursor 遍历联系人,而是应该将你需要的所有数据加载到内存中(例如 HashMap)并通过它 运行。
顺便说一句,如果您更喜欢查询 Contacts/RawContacts table 而不是数据 table,您可以利用 DISPLAY_NAME_ALTERNATIVE 列进行排序,请参阅: https://developer.android.com/reference/android/provider/ContactsContract.ContactNameColumns.html#DISPLAY_NAME_ALTERNATIVE
示例代码:
int selectedGroupId = 12345;
HashSet<Long> ids = new HashSet<>();
// get all CONTACT_IDs belonging to some GROUP_ID
String[] projection = new String[]{Data.CONTACT_ID};
String selection = Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE + "' AND " + GroupMembership.GROUP_ROW_ID + "=" + selectedGroupId;
Cursor c = getContentResolver().query(Data.CONTENT_URI, projection, selection, null, null);
while (c.moveToNext()) {
ids.add(c.getLong(0));
}
c.close();
String[] projection = new String[]{Data.DISPLAY_NAME, Data.MIMETYPE, Data.DATA1};
// you can add more MIMETYPES to the selection here to get phones, emails, etc. for each contact
String selection = Data.CONTACT_ID + " IN (" + TextUtils.join(",", ids) + ") AND " + Data.MIMETYPE + "='" + StructuredName.CONTENT_ITEM_TYPE + "'";
c = getContentResolver().query(Data.CONTENT_URI, projection, selection, null, StructuredName.FAMILY_NAME + " ASC");
DatabaseUtils.dumpCursor(c);
c.close();
我需要 Cursor
选择属于按姓氏排序的特定组的联系人(而不是 display_names)。
很容易让一个游标返回属于所请求组的联系人,另一个返回按姓氏排序的联系人。
然而,姓氏属于 ContactsContract.Data.MIMETYPE = ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE
的 DATA 记录,而属于特定组的联系人将在 ContactsContract.Data.MIMETYPE = ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE
.
如何加入具有不同 CONTENT_ITEM_TYPE 但共享公共字段 RAW_CONTACT_ID
的记录?
你说你需要 select 个联系人,如果是这样你不应该使用 RAW_CONTACT_ID,而是 CONTACT_ID 加入你的联系人数据。 单个联系人可能是多个 RawContact 的集合,在这种情况下,我假设您希望将单个联系人的所有详细信息作为一行。
现在要得到你想要的东西,你不能使用 Cursor 遍历联系人,而是应该将你需要的所有数据加载到内存中(例如 HashMap)并通过它 运行。
顺便说一句,如果您更喜欢查询 Contacts/RawContacts table 而不是数据 table,您可以利用 DISPLAY_NAME_ALTERNATIVE 列进行排序,请参阅: https://developer.android.com/reference/android/provider/ContactsContract.ContactNameColumns.html#DISPLAY_NAME_ALTERNATIVE
示例代码:
int selectedGroupId = 12345;
HashSet<Long> ids = new HashSet<>();
// get all CONTACT_IDs belonging to some GROUP_ID
String[] projection = new String[]{Data.CONTACT_ID};
String selection = Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE + "' AND " + GroupMembership.GROUP_ROW_ID + "=" + selectedGroupId;
Cursor c = getContentResolver().query(Data.CONTENT_URI, projection, selection, null, null);
while (c.moveToNext()) {
ids.add(c.getLong(0));
}
c.close();
String[] projection = new String[]{Data.DISPLAY_NAME, Data.MIMETYPE, Data.DATA1};
// you can add more MIMETYPES to the selection here to get phones, emails, etc. for each contact
String selection = Data.CONTACT_ID + " IN (" + TextUtils.join(",", ids) + ") AND " + Data.MIMETYPE + "='" + StructuredName.CONTENT_ITEM_TYPE + "'";
c = getContentResolver().query(Data.CONTENT_URI, projection, selection, null, StructuredName.FAMILY_NAME + " ASC");
DatabaseUtils.dumpCursor(c);
c.close();