Вопрос по android – GROUP BY с помощью CursorLoader

10

Как мне определитьGROUP BY запрос для моего CursorLoader?

Два конструктора дляCursorLoader Я вижу, взять одинContext илиContext, Uri, projection, selection, selectionArgs а такжеsortOrder.

Но нетgroupBy.

(Я использую пакет поддержки для устройства Android 2.3)

Ваш Ответ

3   ответа
24

Вы можете определить конкретный URI для вашего конкретного предложения GROUP BY.

Например, если у вас есть таблица mPersonTable, возможно, сгруппированная по полу, вы можете определить следующие URI:

PERSON
PERSON/#
PERSON/GENDER

При запросах переключайтесь между своими запросами, чтобы добавить свою группу по параметру:

public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
   String groupBy = null;
   switch (mUriMatcher.match(uri)) {
      case PERSON_ID:
         ...
         break;
      case PERSON_GENDER:
         groupBy = GENDER_COLUMN;
      case PERSON:
        SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
        builder.setTables(mPersonTable);
        builder.setProjectionMap(mProjectionMap);
        return builder.query(db, projection, selection, selectionArgs, groupBy, having, sortOrder, limit);
      default:
         break;
   }
}

На самом деле, вы можете передать любые параметры в ваш запрос

Obs .: Используйте UriMatcher, чтобы сопоставить URI с вашей реализацией запроса.

или где использовать эту функцию
Да, конечно! Добро пожаловать.
@JPMagalhaes: Пожалуйста, помогите мне. Я делаю то же самое, но не понимаю, как заставить это осуществить. Не могли бы вы добавить еще немного кода о том, как это изменить.
На самом деле это отличный обходной путь, даже если для его поддержки требуется контент-провайдер! Спасибо! dbm
Какой именно ваш вопрос? Ключевым моментом является поиск способа установки предложения groupBy в поставщике контента, что напрямую невозможно с помощью LoaderManager. Таким образом, вам нужно определить конкретный URI для этого.
6

selection параметр

new CursorLoader(context,URI,
                        projection,
                                selection+") GROUP BY (coloum_name",
                        null,null);
Я отмечаю это как полезное, потому что это, кажется, единственный ответ, который работает с существующими поставщиками контента (вы не можете добавить URI для группы), но это немного пугает, что это работает.
Это не сработало для меня. Сгенерированный sql-запрос имеет несовпадающее количество круглых скобок, и независимо от того, что я пытался сделать так, чтобы они соответствовали путем добавления или удаления скобок, я всегда получал несоответствие и, следовательно, синтаксическую ошибку.
3

документация четко говорится, чтоCursorLoader запрашиваетContentResolver чтобы получитьCursor, В то время какContentResolver не предоставляет никаких средствGROUP BY следовательно, нетCursorLoader может раскрыть такую функциональность либо.

Таким образом, очевидный ответ на мой собственный вопрос:You can't!

Похожие вопросы