티스토리 뷰

android

11.ContentProbider을 알자

구름나드리 2018. 5. 26. 21:00

11.ContentProvider를 알자



콘텐츠 제공자는 구조화된 데이터 세트의 액세스를 관리합니다.  데이터를 캡슐화하여 데이터 보안을 정의하는데 필요한 메커니즘을 제공하기도 합니다. 콘텐츠 제공자는 한 프로세서의 데이터에 다른 프로세스에서 실행 중인 코드를 연결하는 표준 인터페이스 입니다.

콘텐츠 제공자 내의 데이터에 액세스 하고자 하는 경우, 애플리케이션의 Context에 

있는 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 키워드/매개변수참고
UriFROM table_nameUri table_name이라는 이름의 제공자 테이블에 매핑됩니다.
projectioncol,col,col,...projection은 검색된 각 행에 포함되어야 하는 일련의 열입니다.
selectionWHERE col = valueselection은 행을 선택하는 기준을 지정합니다.
selectionArgs(정확한 등가는 없습니다. 선택 인수는 SELECT 절에 있는 ? 자리 표시자를 대체합니다.)
sortOrderORDER BY col,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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함