2012-03-09 5 views
4

Мне нужно сделать запрос к ContactsContract.Data таблице и значениям в столбце CONTACT_ID будет отличаться.Отличие CONTACT_ID от ContactsContract.Data

Код:

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: рядом с «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, b ut:

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?

ответ

4

Если вы ориентируетесь устройств ниже ICS, вы можете использовать предложение GROUP_BY, добавив ) перед группой по и ( после:

selectionBuilder.append(") GROUP BY (") 

Как ИКС и выше, интерпретатор запросов умнее и закрывает любые закрытые круглые скобки, чтобы предотвратить инъекцию.

Однако, я не понимаю, почему здесь требуется отдельная контактная информация. У контакта, вероятно, должен быть только один Data, чтобы сделать связь с одной группой, поэтому вы, вероятно, получите другой контакт в каждой строке.

Кроме того, может быть что-то связанное с http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html#CONTENT_GROUP_URI, оно не задокументировано, но, учитывая его положение, это может быть прямой доступ к контактам, принадлежащим группе. Вы могли бы использовать, что Ури:

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

А затем запросить его, как Contacts.CONTENT_URI

+0

Да, я нашел свой вопрос и ваши поиски инъекции GROUP BY. Я нашел это очень интересным :) Слишком жаль, что это взломать, и он был заблокирован :) Однако я ищу общее решение не только для GroupMembership. Он также должен быть перенесен в CommonDataKinds.Phone - я знаю о его CONTENT_FILTER_URI, но мой клиент хочет фильтровать ЛЮБОЙ частью телефонных номеров. – QuickNick

+0

Мне понравился ответ, но я хочу открыть щедрость, потому что этот вопрос не получил достаточного внимания. Может быть, ваш ответ был бы лучшим. – QuickNick

Смежные вопросы