Я делаю запрос в Android 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});
}
}