2012-09-18 4 views
19

CursorLoader를 통해 sqlite db에서 데이터를 쿼리하려고합니다. 안드로이드 개발자 웹 사이트의 설명서를 살펴볼 때 제한 쿼리를 찾을 수 없습니다.CursorLoader에서 쿼리 제한

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

내가 어떻게 CursorLoader에 제한을 구현할 수있다?

덕분에 사전

답변

28

hackish 방법 :

String sortOrder = "ROWID LIMIT 5" 

ORDER BY ROWID LIMIT 5가 발생합니다. ROWID은 SQLite가 유지하는 암시 적 행 ID별로 정렬합니다. 정렬을 전혀 지정하지 않으면 발생하는 상황에 매우 가깝습니다. 주문 매개 변수가 제공된 값이 유효한 주문 유형인지 여부를 확인하지 않는다는 사실을 악용하지는 않습니다. 버퍼 오버 플로우 공격의 종류.

더 좋은 방법은 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은 자체 계약서가 있으므로 위의 모든 공급자와 작동하지 않습니다. 그것은 마지막 경로 세그먼트 내에서 다음

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

을 사용하는 등

1

에 당신은 누구의 LIMIT 절을 할 수있는 기능을 제공합니다 SQLiteQueryBuilder 방법을 사용할 수 있습니다. 또는 Yours 선택 문자열에 LIMIT을 추가 할 수 있습니다.
또한 uri를 통해 제한을 제공하고 (일부로) ContentProvider에서 처리 할 수있는 옵션이 있습니다.
CursorLoader은 (는) 현재 모든 API를 제공하지 않습니다.

0

나는이 말을 실감하지만, sandrstar 나에게 당신이 컨텐트 프로로 통과하는 URI를 사용하여 제한을 추가했다 아이디어를 준 당신의 콘텐츠 제공, 당신의 URI 매처에 마지막 경로 세그먼트를 당신이 URI를 일치 matchInt를 확인하고 얻을 쿼리에서 다음

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

일치하는지 확인

uri.getLastPathSegment(); 

다음 중 어느 것이 한계가 될 것이며 SQLiteQueryBuilder에서 권장하는 sandrstar를 사용하십시오.

제공자에게 매개 변수를 전달하는 좋은 기술이 있다면 좋을 것 같습니다. 희망이 도움이!