티스토리 뷰
11.ContentProvider를 알자
콘텐츠 제공자는 구조화된 데이터 세트의 액세스를 관리합니다. 데이터를 캡슐화하여 데이터 보안을 정의하는데 필요한 메커니즘을 제공하기도 합니다. 콘텐츠 제공자는 한 프로세서의 데이터에 다른 프로세스에서 실행 중인 코드를 연결하는 표준 인터페이스 입니다.
있는 ContentResolver 객체가 제공자 객체와 통신하며, 이 객체는 ContentProvider를 구현하는 클래스의 인스턴스 입니다. 제공자는 클라이언트로 부터 데이터 요청을 받아 요청된 작업을 수행하고 결과를 반환합니다.
ContentProvider를 안드로이드 애플리케이션에 일부이지고 데이터 작업을 위한 고유의 UI를 제공하지만 콘텐츠 제공자는 기본적으로 다른 애플리케이션이 사용하도록 만들어진 것입니다. 이들은 제공자 클라이언트 객체를 사용하여 제공자에게 액세스 합니다. 제공자와 제공자 클라이언트와 결합되면 데이터에 하나의 일괄적인 표준 인터페이스를 제공하여 프로세스간 통신과 보안 데이터 액세스도 처리합니다.
개요
콘텐츠 제공자는 외부 애플리케이션에 데이터를 표시하며 이때 데이터는 관계형 데이터베이스에서 찾을 수 있는 테이블과 유사한 하나 이상의 테이블로 표시 됩니다.
참고:
제공자에 기본 키가 꼭 있어야 하는 것은 아니고, 기본 키가 있는 경우 _ID
를 열 이름으로 사용하지 않아도 됩니다. 그러나 제공자의 데이터를 ListView
에 바인드하려면 열 이름 중 하나는_ID
여야 합니다. 이 요구사항은 쿼리 결과 표시 섹션에 자세히 설명되어 있습니다.
제공자 액세스
애플리케이션은 ContentResolver 클라이언트 객체를 이용해 액세스 합니다. 이 객체에는 제공자 객체 내에 같은 이름을 가진 메서드를 호출하는 함수가 있습니다. 이는 ContentProvider의 구체적인 서브클래스 중 하나의 인스턴스 입니다. ContentResolver는 영구 저장소의 기본적인 CRUD 기능을 제공 합니다.
클라이언트 애플리케이션의 프로세스 내에 있는 ContentResolver
객체와 제공자를 소유하는 애플리케이션 내의 ContentProvider
객체가 자동으로 프로세스간 통신을 처리합니다. ContentProvider
또한 콘텐츠 제공자의 데이터 리포지토리와 외부에 테이블로 표시되는 데이터 모습 사이에서 추상화 계층 역할을 합니다.
참고: 제공자에 액세스하려면 보통은 애플리케이션이 제공자의 매니페스트 파일에 있는 특정 권한을 요청해야 합니다. 이것은콘텐츠 제공자 권한 섹션에 더 자세히 설명되어 있습니다.
예를 들어 사용자 사전 제공자로부터 단어와 그에 해당하는 로케일 목록을 가져오려면, ContentResolver.query()
를 호출하면 됩니다. query()
메서드는 사용자 사전 제공자가 정의한 ContentProvider.query()
메서드를 호출합니다. 다음 몇 줄의 코드는 ContentResolver.query()
호출을 보여줍니다.
// Queries the user dictionary and returns results
mCursor = getContentResolver().query(
UserDictionary.Words.CONTENT_URI, // The content URI of the words table
mProjection, // The columns to return for each row
mSelectionClause // Selection criteria
mSelectionArgs, // Selection criteria
mSortOrder); // The sort order for the returned rows
// Queries the user dictionary and returns results
mCursor = getContentResolver().query(
UserDictionary.Words.CONTENT_URI, // The content URI of the words table
mProjection, // The columns to return for each row
mSelectionClause // Selection criteria
mSelectionArgs, // Selection criteria
mSortOrder); // The sort order for the returned rows
// Queries the user dictionary and returns results
mCursor = getContentResolver().query(
UserDictionary.Words.CONTENT_URI, // The content URI of the words table
mProjection, // The columns to return for each row
mSelectionClause // Selection criteria
mSelectionArgs, // Selection criteria
mSortOrder); // The sort order for the returned rows
query() 인수 | SELECT 키워드/매개변수 | 참고 |
---|---|---|
Uri | FROM table_name | Uri 가 table_name이라는 이름의 제공자 테이블에 매핑됩니다. |
projection | col, | projection 은 검색된 각 행에 포함되어야 하는 일련의 열입니다. |
selection | WHERE col = value | selection 은 행을 선택하는 기준을 지정합니다. |
selectionArgs | (정확한 등가는 없습니다. 선택 인수는 SELECT 절에 있는 ? 자리 표시자를 대체합니다.) | |
sortOrder | ORDER BY col, | sortOrder 는 반환된 Cursor 내에 행이 나타나는 순서를 지정합니다. |
콘텐츠 URI
콘텐츠 URI는 제공자에서 데이터를 식별하는 URI입니다. 콘텐츠 URI에는 전체 제공자의 상징적인 이름(제공자의 권한)과 테이블을 가리키는 이름(경로)이 포함됩니다. 제공자 내의 테이블에 액세스하기 위해 클라이언트 메서드를 호출하는 경우, 그 테이블에 대한 콘텐츠 URI는 인수 중 하나입니다.
앞서 몇 줄의 코드에는 상수 CONTENT_URI
에 사용자 사전 "단어" 테이블의 콘텐츠 URI가 들어있습니다. ContentResolver
객체가 이 URI의 권한을 파싱한 다음, 이를 이용해 제공자를 "확인"합니다. 즉 이 권한을 알려진 제공자로 이루어진 시스템 테이블과 비교하는 것입니다. 그러면 ContentResolver
가 쿼리 인수를 올바른 제공자에게 발송할 수 있습니다.
ContentProvider
는 콘텐츠 URI의 경로 부분을 사용하여 액세스할 테이블을 선택합니다. 제공자에는 보통 제공자가 노출하는 테이블마다 경로가 있습니다.
앞선 몇 줄의 코드에서 "단어" 테이블에 대해 완전한 URI는 다음과 같습니다.
content://user_dictionary/words
여기에서 user_dictionary
문자열은 제공자의 권한이고 words
문자열은 테이블의 경로입니다. 문자열content://
(구성표)는 언제나 표시되며, 콘텐츠 URI로 이를 식별합니다.
대다수의 제공자에서는 URI의 맨 끝에 ID 값을 추가하면 테이블 내 하나의 행에 액세스할 수 있습니다. 예를 들어 사용자 사전에서 _ID
가 4
인 행을 검색하려면, 이 콘텐츠 URI를 사용하면 됩니다.
Uri singleUri = ContentUris.withAppendedId(UserDictionary.Words.CONTENT_URI,4);
일련의 행을 검색한 다음 그 중 하나를 업데이트하거나 삭제하고자 하는 경우 종종 ID 값을 사용합니다.
참고: Uri
및 Uri.Builder
클래스에는 문자열에서 잘 구성된(Well-Formed) URI 객체를 구성하기 위한 편의 메서드가 들어 있습니다. ContentUris
클래스에는 URI에 ID 값을 추가하는 편의 메서드가 들어 있습니다. 이전의 스니펫은 withAppendedId()
를 사용하여 UserDictionary 콘텐츠 URI에 ID를 추가합니다.
'android' 카테고리의 다른 글
13 mvvm GitHubService (0) | 2018.07.11 |
---|---|
12.GitHubService Ex (1) | 2018.07.06 |
10.IntentService를 활용하자 (0) | 2018.05.26 |
9. 상주 서비스를 만들자 (0) | 2018.05.23 |
8. Service의 종류와 수명주기를 이해하자 (0) | 2018.05.20 |