[안드로이드] 컨텐트 프로바이더 쿼리하기

반응형






< 컨텐트 프로바이더에게 쿼리하기 위해서는 세 가지가 필요합니다 >

읽기전에 손가락 한번 클릭~ >_<

고마워요 ~ Chu ~ ♥




컨텐트 프로바이더 쿼리하기


컨텐트 프로바이더에게 쿼리하기 위해 필요한 세 가지가 있습니다.
1. 프로바이더를 식별하는 URI
2. 받고자하는 데이터 필드의 이름들
3. 그 필드들의 데이터 타입

추가적으로 특정 레코드를 쿼리하고자 한다면 그 레코드의 ID 도 필요할 것입니다.


쿼리 만들기

컨텐트 프로바이더에 쿼리하기 위해서는 우선 ContentResolver.query() 메소드 또는 Activity.managedQuery() 메소드를 사용할 수 있습니다.
여기의 두 메소드 모두는 동일한 매개변수 집합을 가지며, 둘다 커서 객체를 리턴해 줍니다.

managedQuery() 메소드는 액티비티로 하여금 커서의 생명주기를 관리할 수 있게 합니다. 매니지드 커서는 액티비티가 멈출 때 스스로를 제거하고, 액티비티가 다시 시작될 때 스스로를 재쿼리 하는것과 같이 모든것을 관리해 줍니다.

Activity.startManagingCursor() 메소드를 호출함으로써, 관리되지 않는 커서 객체를 액티비티가 관리하도록 할 수도 있습니다. query() 메소드나 managedQuery() 메소드에 대한 첫번째 메개변수는 프로바이더의 URI 입니다.

이전글에서도 나왔지만 CONTENT_URI 상수는 특정 컨텐트 프로바이더와 데이터 집합을 식별합니다. 쿼리를 하나의 레코드로 제한하려면, URI에 그 레코드의 _ID 값을 추가하면 되겠지요. 즉 URI 경로 영역의 끝에다가 ID와 일치하는 문자열을 넣으면 됩니다.

예를들어 ID가 3번인 경우 URI에는
content://....../3
처럼 될 것입니다.

이곳에는 몇 개의 헬퍼 메소드가 존재합니다. 특별히 ContentUris.withAppendedId() 메소드와 Uri.withAppendedPath() 메소드는 URI 에 ID를 추가하는 것을 지원해줍니다.
두 메소드 모두는 추가된 ID를 보유한 Uri 객체를 리턴하는 static 메소드 입니다.

예를들어 전화번호 DB에서 3번 레코드를 찾는다면,


query() 메소드와 managedQuery() 메소드에 대한 다른 인자들은 더욱 상세하게 쿼리의 범위를 규정하기 위해 존재합니다. 이것은 다음와 같은 일을 합니다.
리턴 받아야 하는 데이터 칼럼의 이름들. null 값은 모든 컬럼을 리턴합니다. 그렇지 않으면 그 이름으로 리스트 된 컬럼만 리턴되겠네요. 그 플랫폼에 속하는 모든 컨텐트 프로바이더는 그들의 컬럼에 대한 상수를 정의합니다.

SQL WHERE 절로 형성되는 것으로, 리턴할 행들을 기술하는 필터입니다. null 값은 모든 행들을 리턴합니다. ( Uri 가 하나의 레코드로 쿼리 제한을 안하는 경우 )

선택할 것에 대한 아귀먼트들.

SQL ORDER BY 절로 형성되는 것이며, 리턴될 행에 대한 정렬 순서입니다. null 값은 테이블에 있는 디폴트 순서로 처리됩니다.


컨택의 이름들과 기본 전화번호에 대한 리스트를 가져오기 위한 쿼리 예제를 보시면 좀 더 이해하기 쉬울 것입니다.


이 쿼리는 컨택(contacts) 컨텐트 프로바이더의 People 테이블에서 데이터를 가져옵니다. 즉 각 컨택에 대한 이름,전화번호,고유 ID를 얻습니다.
또한 각 레코드의 _COUNT 필드에 리턴되는 레코드들의 개수를 보고합니다.

컬럼 이름에 대한 상수는 다양한 인터페이스로 정의됩니다.
BaseColumns 에 있는 _ID 와 _COUNT ,
PeopleColumns 에 있는 NAME ,
PhoneColumns 에 있는 NUMBER 가 그것 입니다.

Contacts.People 클래스는 이러한 각각의 인터페이스를 구현합니다. 코드 예제가 클래스 이름만을 사용해서 그것들을 참조할 수 있는 이유가 이것입니다!



쿼리가 리턴하는 것

쿼리는 0 개 또는 그 이상의 DB 레코드들의 집합을 리턴해줍니다.
컬럼 이름, 순서, 데이터 타입은 각각의 컨텐트 프로바이더에 따라 다릅니다.
모든 프로바이더는 각 레코드에 대한 고유 ID인 _ID 컬럼을 가지고 있습니다.

또 모든 프로바이더는 _COUNT 컬럼으로 리턴되는 레코드들의 개수를 보고합니다.
( 그 값은 모든 행에서 동일합니다 ~ )

_ID _COUNT NAME NUMBER
44 3 Alan Vain 212 555 1234
13 3 Bully Pulpit 425 555 6677
53 3 Rex Cars 201 555 4433


이전 쿼리에서의 결과값 이라고 보시면 됩니다 ^^

가져온 데이터는 커서 객체에 의해 보여지게 되며, 커서 객체는 그 결과 SET을 뒤 또는 앞으로 반복하기 위해 사용될 수도 있습니다. 하지만 대부분은 여전히 데이터를 읽기 위해서만 커서 객체를 사용하게 되겠지만요...ㅎ

이때, 데이터를 추가/수정/삭제 하기 위해서는 컨텐트 리졸버 객체를 사용해야 합니다.

여기에 대해선 다음 포스팅에 이어갑니다 ^^


끝~~







관련글
[안드로이드] 컨텐트 프로바이더와 URI
[안드로이드] 컴포넌트 #4 - 컨텐츠 프로바이더




반응형

댓글

Designed by JB FACTORY