Я делаю запрос в Android Contacts ContentProvider. Мне нужно предложение Group By. В Gingerbread и Honeycomb, я делаю что-то вроде этого для одновременного поиска телефонных номеров и электронных писем:
(Фактическое предложение WHERE намного сложнее, поскольку оно включает проверку типов. Это упрощение, но оно дает тот же результат)
String request = Phone.NUMBER + " LIKE ? OR " + Email.DATA + " LIKE ?";
String[] params = new String["%test%", "%test%"];
Cursor cursor = getContentResolver().query(
Data.CONTENT_URI,
new String[] { Data._ID, Data.RAW_CONTACT_ID },
request + ") GROUP BY (" + Data.RAW_CONTACT_ID,
params, "lower(" + Data.DISPLAY_NAME + ") ASC");
Внедрение ')' завершает предложение WHERE и позволяет вставить предложение GROUP BY.
Однако в Ice Cream Sandwich похоже, что ContentProvider обнаруживает это и добавляет правильное количество скобок, чтобы предотвратить мою инъекцию. Есть ли другой способ сделать это в запросе с одним курсором?
В настоящее время я удалил GROUP BY и добавил MatrixCursor, чтобы ограничить воздействие, но я бы предпочел иметь настоящий курсор:
MatrixCursor result = new MatrixCursor(new String[] { Data._ID, Data.RAW_CONTACT_ID });
Set<Long> seen = new HashSet<Long>();
while (cursor.moveToNext()) {
long raw = cursor.getLong(1);
if (!seen.contains(raw)) {
seen.add(raw);
result.addRow(new Object[] {cursor.getLong(0), raw});
}
}