2011-02-15 2 views
9

내가 충격받는 흥미로운 질문은 인터넷에서 더 자주 묻지 않았습니다. Android의 CursorAdapter는 ContentProvider를 실행하고 사용하는 방법을 배우면 매우 유용하지만 _id 필드를 쿼리의 일부로 사용하는 요구 사항으로 인해 제한됩니다 (오류가 발생하지 않으면 오류가 발생 함). 이유는 다음과 같습니다.DISTINCT를 사용하는 쿼리가 포함 된 Android의 SimpleCursorAdapter

내 특정 문제는 하나의 회 전자에 데이터베이스의 고유 한 "카테고리"이름이 있어야하고 다른 하나에는 선택한 "카테고리"(범주가있는 모든 데이터베이스 항목이 채워 져야 함)입니다. 열 이름, 여기). 이것은 많은 프로그램에서 사용할 수있는 아주 간단한 설정처럼 보입니다. 첫 번째 스피너를 구현하려고하면 문제가 발생합니다.

SELECT DISTINCT category FROM table; 

_id 컬럼이 쿼리의 일환으로 필요하기 때문에이 쿼리를 만드는 것은 CursorAdapter에 오류가 발생합니다 :

는 여기에 내가 첫 회에 대해하고 싶은 질문입니다. 투영에 _id 열을 추가하면 테이블의 모든 행이 자연스럽게 반환됩니다. 이제는 다른 ID도 요청하고 모든 ID는 별개입니다 (정의에 따라). 분명히 나는 ​​오히려 카테고리 이름마다 하나의 엔트리 만 보게 될 것이다.

나는 이미 위의 쿼리를 만든 다음 결과를 ArrayAdapter에 복사하기 만하면되는 작업을 이미 구현했습니다. 이 게시물에 대한 내 이유는이 이상한 작은 문제에 대한보다 우아한 해결책이 있는지 확인하고 내가 더 잘할 수있는 것에 대한 토론을 시작하는 것입니다. 다른 종류의 컨트롤이나 어댑터를 사용하는 것과 같은 대체 구현 제안은 매우 환영합니다.

답변

6

내가 함께 결국 쿼리입니다 이것을 수행하기 위해 SQLiteDatabase 객체에서 rawQuery() 함수를 사용했습니다. "GROUP BY"는 올바른 결과를 얻는 열쇠 였기 때문에 Sagar에게 올바른 방향으로 나를 가리켜주었습니다.

이 문제에 대한보다 우아한 해결책이 될 수 있으므로이 질문에 대한 사용자 Al Sutton의 답변도 고려하십시오.

감사합니다.

아직
4

유일한 카테고리 당 하나의 행을 포함하는 _id & 카테고리의 별도 표가있는 것이 좋습니다. 그런 다음 데이터 행은 카테고리 테이블의 _id로 카테고리 필드를 대체 할 수 있습니다.

범주 테이블에서 범주를 변경할 수 있다는 이점이 추가되어 해당 범주의 모든 항목에 표시됩니다.

+0

오,이 우수한 데이터베이스 설계처럼 보인다 나를! 가능한 한 단순하게 콘텐츠 제공 업체를 유지하기 위해 나는 테이블 수를 최소한으로 유지하도록 지시 했었습니다. 그렇지 않으면 내가 제안한대로 할 것입니다. 이것을 추가해 주셔서 감사합니다! – SilithCrowe

+0

컨텐트 프로 바이더는 다중 테이블 쿼리를 사용하여 컨텐트 이름에 제공된 범주에서 범주 이름을 추출하고 범주 이름을 반환 할 수 있습니다. SQL "조인"명령을 살펴보십시오. –

3
SELECT DISTINCT category,_id FROM table GROUP BY category; 

나는이 당신이 찾고있는 무엇을 제공해야한다고 생각 . 이것의 결과는 해당 범주의 첫 번째 _id가됩니다. 두 번째 열 (_id)은 무시할 수 있습니다.

당신은 예를 들어, 단지 상수 값 당신의 선택 문에 _id 필드 별칭을 지정할 수 있습니다
+0

DISTINCT 토큰은이 작업을하지 못하게하지만 GROUP BY는 훌륭한 제안이었습니다! – SilithCrowe

0

:

SELECT _id, category FROM table_name GROUP BY category; 

I : 여기

SELECT DISTINCT 0 _id, category FROM table;

0

더 나은, 나는 사용하여이 문제를 해결 : 당신은 당신이 원하는 것을 가지고있는 이름 _id와 열이

SELECT DISTINCT category AS _id FROM table 

을 지금

관련 문제