Группа В ContentResolver в мороженом сэндвич

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

Вы можете создать пользовательский Uri , чтобы, когда ваш UriMatcher в вашем ContentProvider получит его, вы можете вставить предложение group by, а затем выполнить необработанный sql непосредственно в базе данных.

Сначала прошу прощения за мой ПЛОХОЙ английский! Я новичок в Java / Android, начал с 4.2.1 и сражался с этим почти за 2 дня, а затем начал читать некоторые подробности о SQLiteQueryBuilder, часть запроса в значительной степени похожа на то, что вы ищете;)

Он имеет:

 public Cursor query (SQLiteDatabase db, String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder) 

Запрос «функция» поставщика контента дает вам:

 query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) 

Здесь вы можете обмануть, я отправлю вам свой код:

  @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); final SQLiteDatabase db = mOpenHelper.getReadableDatabase(); /* a String is a Object, so it can be null!*/ String groupBy = null; String having = null; switch (sUriMatcher.match(uri)) { ... ... ... case EPISODES_NEXT: groupBy = "ShowID"; queryBuilder.setTables(EpisodenTable.TableName); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } Cursor c = queryBuilder.query(db, projection, selection, selectionArgs, groupBy, having, sortOrder); c.setNotificationUri(getContext().getContentResolver(), uri); return c; } 

это оно!

Здесь код, который я использую для выполнения:

  Cursor showsc = getContext().getContentResolver().query( WhatsOnTVProvider.CONTENT_EPISODES_NEXT_URI, EpisodenTable.allColums_inclCount, String.valueOf(Calendar.getInstance().getTimeInMillis() / 1000) + " < date", null, null); 
Intereting Posts
Значок меню ящика навигации отображается неправильно Как установить режим соединения USB? Как получить доступ к файлам из папки с данными при выполнении тестов? Как получить абсолютный путь в Android для файла? Как я могу отправить приложение для Android, которое я разрабатываю для кого-то по электронной почте? Веб-просмотр Android подходит для всего содержимого экрана Держите TextInputLayout всегда сфокусированным или сохраняйте ярлык всегда расширенным Как получить намерение остановить службу в android Ошибка сборки android на ubuntu 11.10 Как «запустить» экспортированное приложение для Android с помощью Eclipse + Proguard? Подавление Logcat – Как избавиться от всего внутреннего дерьма, который нежелателен? Невозможно настроить предпочтение с помощью функции PreferenceActivity Этот класс обработчика должен быть статическим или может возникнуть утечка: AsyncQueryHandler Как я могу использовать Picasso для добавления значка в Marker? RequestDisallowInterceptTouchEvent не работает, если сначала не выбрать вид