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

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

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

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

Заранее спасибо


person Akilan    schedule 18.09.2012    source источник


Ответы (3)


Хакерский способ:

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 поставляется с собственным контрактом, поэтому вышеуказанное не будет работать с каждым провайдером.

person zapl    schedule 18.09.2012

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

person sandrstar    schedule 18.09.2012

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

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

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

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

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

uri.getLastPathSegment();

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

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

person Aaron Smentkowski    schedule 18.03.2015