[안드로이드] 컨텐트 프로바이더와 URI

반응형





< 데이터를 공유하려면 컨텐트 프로바이더를 사용해야 합니다. >


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

고마워요 ~ Chu ~ ♥



컨텐트 프로바이더

컨텐트 프로바이더는 데이터를 저장하고, 가져오고, 모든 어플리케이션에서 접근할 수 있도록 하는 컴포넌트 입니다.

안드로이드에는 모든 패키지가 접근할 수 있는 공통된 저장공간 따위는 없기 때문에, 컨텐트 프로바이더만이 어플리케이션 간에 데이터를 공유할 수 있는 유일한 방법입니다.

기본 데이터 타입 (문자열, 이미지 등) 에 대한 몇개의 컨텐트 프로바이더 가 있습니다.
(android.provider 패키지에 포함되어 있습니다)

그것들이 보유한 데이터를 위해 이러한 프로바이더에게 쿼리할 수도 있습니다. ( 이 중 몇개는 적절한 퍼미션을 요구하기도 합니다) .

만약 자신의 데이터를 public 하게 하려면 두 가지의 방법이 있습니다.
1. 자신의 컨텐트 프로바이더를 만들기
2. 이미 존재하는 컨텐트 프로바이더에 데이터 추가하기

이 작업은 같은 데이터 타입을 제어할 수 있으면서, 그에 해당하는 퍼미션을 요구합니다.



안드로이드의 모든 컨텐트 프로바이더는 데이터 추가, 수정, 삭제 같은 프로바이더를 쿼리하고 그 결과를 리턴받는 보편적인 인터페이스를 구현합니다.
이것은 가장 일반적으로 컨텐트 리졸버 객체를 이용하여 클라이언트가 사용하는 인터페이스 입니다.

액티비티나 다른 어플리케이션 컴포넌트를 구현한 내부에서 getContentResolver() 메소드를 호출하면 컨텐트 리졸버를 얻을 수 있습니다.
ContentResolver cr = getContentResolver();

이제 이 객체를 통해 컨텐트 프로바이더와 상호작용하는 컨텐트 리졸버의 메소드들을 이용할 수 있겠죠. 왜냐면 객체를 얻었으므로...

하나의 쿼리가 개시되면, 시스템은 쿼리의 대상이 되는 컨텐트 프로바이더를 식별하고, 로드하여 실행하게 됩니다. 이런 작업 때문에 시스템은 모든 컨텐트 프로바이더 객체를 인스턴스화 하도록 합니다

여기서 중요한 점은 개발자는 이런 인스턴스 작업은 할 필요가 없다는 점이겠죠 ^^
실제로 , 컨텐트 프로바이더 객체를 직접 사용하는 경우는 절대 없습니다.

일반적으로 각각의 컨텐트 프로바이더는 타입별로 하나의 인스턴스가 있을 뿐이며, 그것은 서로 다른 어플리케이션에 있는 여러개의 컨텐트 리졸버와 통신할 수 있는 구조입니다. 여기에서 상호작용이라 함은 컨텐트 리졸버와 컨텐트 프로바이더 클래스에 의해 제어됩니다.

쿼리는 각 필드의 내용을 읽기 위하여 레코드의 이동과 컬럼을 이동할 수 있는 커서(Cursor) 객체를 리턴합니다. 여기에 각각의 데이터 타입을 읽기 위한 메소드가 존재하죠. 즉, 특정 필드를 읽기 위해서는 그 필드가 어떤 데이터 타입인지를 알아야 한다는 뜻이 됩니다.


URI

각각의 컨텐트 프로바이더는 그 데이터 집합을 고유하게 식별하는 하나의 public 적인 URI 를 제공해 줍니다. 여러개의 데이터 테이블을 제어하는 컨텐트 프로바이더는 각각에 대한 별도의 URI 를 제공하죠.

프로바이더를 위한 모든 URI 는 "content://" 라는 문자열로 시작됩니다. content: 스키마는 그 데이터가 컨텐트 프로바이더에 의해 제어되는 것으로 간주하는 것입니다.

만약, 컨텐트 프로바이더를 정의하게 되면 코드를 단순화하고 수정이 쉽도록 하기위해 URI 를 상수로 정의하면 좋을 것입니다.

안드로이드 플랫폼의 모든 프로바이더에는 CONTENT_URI 를 정의하고 있습니다.
예를들면 전화번호 테이블의 URI 는
android.provider.Contacts.Phones.CONTENT_URI
가 됩니다.

통화목록 테이블의 URI는
android.provider.CallLog.Calls.CONTENT_URI
가 되네요.

URI 상수는 컨텐트 프로바이더 와의 모든 상호작용에서 긴밀하게 사용됩니다. 모든 컨텐트 리졸버 메소드는 첫번째 인자로 URI 를 갖게 되어있는데요, 이것은 컨텐트 리졸버가 어떤 프로바이더와 통신하는지, 프로바바이더의 어떤 테이블을 참조하는지를 구분하게 해주는 아주 중요한 역할을 합니다.





끝~~








관련글




반응형

댓글

Designed by JB FACTORY