Part 3. 콘텐트 제공자
01. 콘텐트 제공자
콘텐트 제공자
다른 어플리케이션에 데이터를 공급하는 역할을 하는 컴포넌트
데이터 공급을 추상화해 데이터 계층과 어플리케이션 계층을 분리하는 역할을 함
어플리케이션이 데이터가 어디서 제공되는지에 상관없이 동일한 방식으로 처리할 수 있도록 함
=> 어플리케이션 간 데이터 공유의 가장 바람직한 수단으로 여겨짐
콘텐트 제공자의 사용 예
주소록, 캘린더(일정) 정보 등
Browser, CallLog, ContactsContract, MediaStore, Calendar, Setting, UserDictionary
02. 콘텐트 제공자의 기본
개요
관계 데이터베이스의 테이블 형태로 데이터를 외부 어플리케이션에 제공한다.
콘텐트 제공자 접근
어플리케이션이 원하는 콘텐트 제공자를 찾도록 도와주는 객체가 바로 ContentResolver 객체이다. 이는 getContentResolver()를 호출해 얻을 수 있는데, 메소드가 CRUD(create, retrieve, update, delete) 기능을 제공한다. ContentProvider 객체와는 서로 다른 어플리케이션에서 실행되기 때문에 프로세스 간 통신으로 데이터를 주고받는다.
쿼리 작성하기
query()는 콘텐트 제공자의 ContentProvider.query()를 호출하게 된다. 이는 SQL SELECT 문장과 매우 유사하다.
필요한 매개변수만을 표시하고 나머지는 null로 주면 되며, null이 주어지면 모든 레코드를 반환한다. query()의 매개변수 sortOrder 는 반환되는 레코드들의 정렬 순서를 나타낸다.
콘텐트 URI
콘텐트 제공자 내 테이블을 가리키는 URI(URL, USN으로 이루어짐)이다. 이는 문자열을 이용해 텍스트나 비디오, 사운드 클립, 정지 화상, 동영상, 프로그램 등 콘텐트들을 식별하는 규격이다.
콘텐트 제공자에게 데이터를 요청하려면 URI 문자열을 Uri 객체로 변환해야 하는데, 안드로이드에 내장되어 있는 콘텐트 제공자들은 Uri 객체를 상수로 제공하고 있다.
03. 콘텐트 제공자로부터 데이터 읽기
절차
1. 콘텐트 제공자를 통하여 데이터를 읽을 수 있는 권한을 매니페스트 파일에 표시한다.
2. 쿼리를 작성하여 실행한다.
3. 쿼리의 결과로 반환된 레코드들을 커서 객체를 통하여 순회하면서 원하는 작업을 한다.
권한 표시하기
매니페스트 파일에 <uses-permission> 요소를 사용해 읽기 권한을 표시한다.
쿼리 작성 및 결과 표시하기
ContentResolver.query() 를 이용해 추출된 데이터는 커서 객체를 통해 변환되며, 커서 객체를 이용해 레코드 집합에서 레코드를 순회하면서 데이터를 읽을 수 있다.
커서 객체를 통해 데이터를 읽는 방법은 데이터베이스와 동일하며, 레코드의 특정 필드에서 데이터를 읽으려면 먼저 필드의 자료형을 알아야 한다. 커서 객체는 컬럼의 인덱스값을 받아 컬럼의 이름을 반환하거나 반대의 기능을 하기도 한다.
커서 어댑터 이용하기
커서 객체가 행들의 리스트이므로 SimpleCursorAdapter를 통해 ListView를 사용하는 것이 객체 내용을 표시하는 데 가장 적합한 방법이다. query()가 반환하는 커서 객체를 받아 SimpleCursorAdapter를 생성하고 ListView를 위한 어댑터로 연결한다.
예제 - ReadBrowserData
04. 주소록
ContactsContract 클래스
주소록 제공자를 사용하는 데 필요한 클래스들을 가지고 있다.
주소록 데이터베이스의 구조
통합 주소록을 나타내는 Contacts, 통합되지 않은 주소록 정보를 저장하는 RawContacts, RawContacts와 관련된 모든 데이터를 저장하는 Data 등 세 개의 테이블을 사용해 주소를 저장한다.
주소록의 통합
주소록은 이름이 일치하거나, 같은 단어로 되어 있고 순서만 다른 경우 서로 일치하는 것으로 간주하여 하나로 통합한다.
주소록 콘텐트 제공자 사용법
예제 - ShowContacts
05. 콘텐트 제공자를 이용하여 데이터 변경하기
데이터 추가
콘텐트 제공자에게 새로운 데이터를 추가하기 위해서는 ContentValues 객체 안에서 (key, value)의 형태로 새로운 데이터를 저장한다. 이어서 콘텐트 제공자의 URI와 ContentValues 객체를 인수로 해 insert()를 호출한다. insert()가 반환하는 URI는 쿼리에 사용될 수 있고 Cursor 객체를 통해 레코드를 변경할 수 있다.
데이터 업데이트
행을 업데이트하려면 ContentValues 객체에 새로운 값을 채우고 ContentResolver.update()를 호출하면 된다. ContentValues 객체에는 업데이트가 필요한 값만을 채우면 된다.
컬럼의 내용을 삭제하고 싶으면 값을 null 로 설정하면 된다.
데이터 삭제
행을 삭제하는 것은 행을 추출하는 것과 유사하다. 삭제하고 싶은 행의 조건을 selection애 지정한 후 delete()를 호출한다.
예제 - ProviderTest02
Lab. Calendar Provider
(실행 X)
'안드로이드 프로그래밍' 카테고리의 다른 글
| Ch08 지도, 멀티미디어 - Part 1 (0) | 2016.01.19 |
|---|---|
| Ch07. 프로세스, DB, 네트워크 - Part 4 (0) | 2016.01.14 |
| Ch07. 프로세스, DB, 네트워크 - Part 2 (0) | 2016.01.07 |
| Ch07. 프로세스, DB, 네트워크 - Part 1 (0) | 2015.12.08 |
| Ch06. 액티비티, 보안, 서비스 - Part 3 (0) | 2015.11.30 |