【问题标题】:Distinct CONTACT_ID from ContactsContract.Data与 ContactsContract.Data 不同的 CONTACT_ID
【发布时间】:2012-03-09 14:04:57
【问题描述】:

我需要查询ContactsContract.Data 表,CONTACT_ID 列中的值会不同(不同)。

代码:

final Uri uri = ContactsContract.Data.CONTENT_URI;
final String[] projection = new String[] {//
    ContactsContract.Data.CONTACT_ID, //
    ContactsContract.Data._ID, //
    ContactsContract.Data.DISPLAY_NAME,//
    ContactsContract.Data.LOOKUP_KEY //
};
final StringBuilder selectionBuilder = new StringBuilder();
selectionBuilder.append(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID);
selectionBuilder.append("= ? AND ");
selectionBuilder.append(ContactsContract.Data.MIMETYPE);
selectionBuilder.append("= ? ");
final String selection = selectionBuilder.toString();
final String[] selectionArgs = new String[] {//
    String.valueOf(groupId), //
    ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE //
};
return context.getContentResolver().query(uri, projection, selection, selectionArgs, null);

首先,我尝试在投影中将“DISTINCT”添加到ContactsContract.Data.CONTACT_ID。但是有一个例外:java.lang.IllegalArgumentException: Invalid column DISTINCT contact_id

那么,我是这样写的:

"'DISTINCT "+ContactsContract.Data.CONTACT_ID+"'".
java.lang.IllegalArgumentException: Invalid column 'DISTINCT contact_id'

然后,我添加到 selectionBuilder:

selectionBuilder.append(" GROUP BY ").append(ContactsContract.Data.CONTACT_ID);

再次出现异常:android.database.sqlite.SQLiteException: near "GROUP": syntax error: , while compile: SELECT contact_id, _id, display_name, lookup FROM view_data_restricted data WHERE (1) AND (data1= ? AND mimetype= ? GROUP BY contact_id) ORDER BY display_name ASC

最后,我在 sortOrder 之后添加了“group by”语句,但是:

android.database.sqlite.SQLiteException: near "GROUP": syntax error: , while compiling: SELECT contact_id, _id, display_name, lookup FROM view_data_restricted data WHERE (1) AND (data1= ? AND mimetype= ? ) ORDER BY display_name ASC GROUP BY contact_id

是否可以使用 distinct 进行查询? 也许,我应该在 URI 上附加一些东西?

【问题讨论】:

    标签: android sql distinct android-contacts contactscontract


    【解决方案1】:

    如果您的目标设备低于 ICS,则可以使用 GROUP_BY 子句,方法是在 group by 之前添加 ) 并在之后添加 (

    selectionBuilder.append(") GROUP BY (")
    

    从 ICS 及更高版本开始,查询解释器更加智能,并关闭任何未闭合的括号以防止注入。

    但是,我不明白为什么您需要不同的contact_ids。一个联系人可能应该只有一个数据来与一个组建立关联,因此您可能会在每条线路上收到不同的联系人。

    此外,http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html#CONTENT_GROUP_URI 可能与它没有记录有关,但考虑到它的位置,它很可能是对属于某个组的联系人的直接访问。你会使用那个 Uri :

    Uri uri = ContentUri.withAppendedId(ContactsContract.Contacts.CONTENT_GROUP_URI, groupId);
    

    然后像 Contacts.CONTENT_URI 一样查询它

    【讨论】:

    • 是的,我找到了您的问题以及您对 GROUP BY 注入的搜索。我发现它非常有趣 :) 太遗憾了,它是一个 hack,它被阻止了 :) 但是,我寻求共同的决定,不仅仅是为了 GroupMembership。它还必须移植到 CommonDataKinds.Phone - 我知道它的 CONTENT_FILTER_URI,但我的客户希望按电话号码的任何部分进行过滤。
    • 我喜欢你的回答,但我想打开赏金,因为这个问题没有得到足够的关注。也许,你的答案是最好的。
    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2020-03-20
    • 2018-12-13
    相关资源
    最近更新 更多