Отличный CONTACT_ID от ContactsContract.Data - PullRequest
4 голосов
/ 09 марта 2012

Мне нужно сделать запрос к таблице 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.append(" GROUP BY ").append(ContactsContract.Data.CONTACT_ID);

Еще раз: исключение: android.database.sqlite.SQLiteException: рядом с «GROUP»: синтаксическая ошибка: при компиляции: 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

Наконец, я добавляю оператор group by сразу после sortOrder, но:

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

Можно ли когда-нибудь сделать запрос с отчетливым? Может быть, я должен добавить что-то в URI?

1 Ответ

5 голосов
/ 09 марта 2012

Если вы ориентируетесь на устройства ниже ICS, вы можете использовать предложение 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

...