我正在尝试将联系人多对多地映射到群组。
例如,如果我有:
我希望得到一个看起来像这样的关系:
userID | groupID
1 | 701
1 | 702
1 | 704
3 | 702
我试过这个:
Cursor cursor = contentResolver.query(ContactsContract.Data.CONTENT_URI, null, new String[] {
ContactsContract.CommonDataKinds.GroupMembership.CONTACT_ID,
ContactsContract.CommonDataKinds.GroupMembership.GROUP_SOURCE_ID
}, null, null, null);
但这不太有用。 GROUP_SOURCE_ID列返回不是任何组ID的奇怪数字。有时甚至会返回0或负数。
我可以通过浏览每个组来构建这个映射,然后找到该组中的所有联系人,但这会需要很多查询,而我正试图保持快速(显然,只是那些少数查询是相当的慢!)。
有谁能告诉我如何在一个查询中获得这种联系人到组的映射?
谢谢!
答案 0 :(得分:12)
Cursor dataCursor = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[]{
ContactsContract.Data.CONTACT_ID,
ContactsContract.Data.DATA1
},
ContactsContract.Data.MIMETYPE + "=?",
new String[]{ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE}, null
);
通过使用此dataCursor
,您将获得联系人数据库中所有联系人的contact_id
和group_id
。
Cursor groupCursor = getContentResolver().query(
ContactsContract.Groups.CONTENT_URI,
new String[]{
ContactsContract.Groups._ID,
ContactsContract.Groups.TITLE
}, null, null, null
);
使用此groupCursor
,您将获得联系人数据库中所有群组的group_id
和group_title
。
因此,如果您希望获得与contact_id
相关联的所有组,则首先使用合适的select语句获取dataCursor
。使用dataCursor
,您可以获得与该group_id
相关联的所有contact_id
。现在使用groupCursor
,您可以获得与该特定联系人相关联的所有组的信息。
答案 1 :(得分:0)
awk 'NR==FNR{a[$1]=$2;next}$2 in a{$2=a[$2]}1' <(echo "$var2") <(echo "$var1")