Подтвердить что ты не робот

Ограничить запрос в CursorLoader

Я пытаюсь запросить данные из sqlite db через CursorLoader. Когда я просматриваю документацию на веб-сайте разработчика Android, я не могу найти предельный запрос.

CursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

Как я могу реализовать ограничение в CursorLoader?

Спасибо в Advance

4b9b3361

Ответ 1

Хукинг:

String sortOrder = "ROWID LIMIT 5"

что приведет к ORDER BY ROWID LIMIT 5. ROWID будет сортировать по неявным идентификаторам строк, которые поддерживает SQLite, - очень близко к тому, что происходит, когда вы вообще не укажете сортировку. Не то, чтобы это злоупотребляло тем фактом, что параметр порядка не проверяет, является ли поставляемое значение только допустимым типом заказа. Вид атаки переполнения буфера.

Лучше всего было бы определить параметры Uri.

// query code
Uri queryUri = Uri.parse("content://what/ever/items");
queryUri = queryUri.buildUpon().appendQueryParameter("limit", "5").build();

// in ContentProvider
String limit = queryUri.getQueryParameter("limit");

Оба подхода будут работать, только если ContentProvider совместим с вышеуказанными попытками ограничить. На самом деле нет четко определенного способа ограничить или выбрать определенные данные из ContentProvider. Каждый ContentProvider поставляется с собственным контрактом, поэтому выше не будет работать с каждым провайдером.

Ответ 2

Вы можете использовать SQLiteQueryBuilder методы, которые предоставляют возможность иметь предложение LIMIT. Или вы можете просто добавить LIMIT в свою строку выбора.
Кроме того, существует возможность предоставить лимит через uri (как часть его) и обрабатывать его в ContentProvider.
Похоже, CursorLoader не предоставляет никакого API для этого в настоящее время.

Ответ 3

Я понимаю, что это поздно, но sandrstar дал мне идею, которая должна была использовать Uri, который вы передаете ContentProvider, и добавьте предел в качестве последнего сегмента пути к нему, используя

Uri.withAppendedPath("uri" "/" + limitNumber);

Затем внутри вашего провайдера контента в вашем совпадении URI убедитесь, что вы соответствуете

MATCHER.addURI("authority", "uri" + "/#", matchInt); 

Затем в вашем запросе проверьте соответствие matchInt, с которым вы сопоставляете URI, и получите последний сегмент пути

uri.getLastPathSegment();

Какой будет ваш лимит, а затем используйте то, что рекомендуется sandrstar с помощью SQLiteQueryBuilder.

Просто подумал, что было бы неплохо иметь хорошую технику, чтобы получить ваш параметр для Провайдера. Надеюсь, это поможет!