[Udacity] Create a Content Provider



Android Application Anatomy


DB ↔ CP ↔ CR



안드로이드 컨텐트 프로바이더

Android 4대 컴포넌트 중 하나

다른 패키지의 데이터에 접근할 수 있는 통로

File, DB, Memory 등과 같은 저장소를 각각의 Application에서 공통된 인터페이스로 접근 가능하도록 지원





컨텐트 프로바이더의 구조

이처럼 다른 패키지가 제공하는 통로, 컨텐츠 프로바이더에 접근하기 위해서는 서비스에서 본 '바인더 통신'이 필요함

서로 다른 프로세스는 메모리를 공유할 수 없기 때문


안드로이드는 이 작업을 쉽게 할 수 있도록 안드로이드에서는 RPC방식을 사용하는 컨텐츠 리졸버를 제공


[1] 패키지 B가 CP를 사용하기 위해 Content Resolver 객체를 얻음

[2] Content Resolver는 Provider 주소를 통해 CP에 접속, 각종 요청을 함

[3] CP는 저장소에 접근하여 요청을 처리하고 그 응답을 다시 Content Resolver에게 전달


이런 식으로 패키지 A의 Database를 패키지 B에서 이용할 수 있게 됨

여기서 프로바이더가 제공하는 Call 인터페이스를 통해, 자료 뿐 아닌 프로바이더가 제공하는 함수도 이용할 수 있다



컨텐트 제공하기

ContentProvider 클래스 상속, 정보 관리/제공하는 메서드를 재정의

android:exported="true"로 CP의 이름과 제공자명을 매니페스트에 등록

안드로이드 4.2(SDK 16) 이후부터 보안성 개선을 위해 디폴트로 CP를 공개하지 않아 명시적으로 공개해야 함

DB를 사용한다면 onCreate에서 DB를 오픈

DB뿐만 아닌 배열, 미디어, SD카드, 네트워크의 정보 제공 가능

안드로이드 스튜디오의 New - Other - Content Provider에서 생성시 자동으로 생성됨: CP 기본 6개 함수 구현

보통 안드로이드에서 제공하는 SQLite OpenHeoper와 같은 데이터베이스 관리도구와 함께 사용





public Class myProvider extends Content Provider

onCreate(): DB 사용시 DB를 열어둠

insert(): 행 하나를 삽입

update(): 갱신

query(): 실제 데이터를 제공
delete(): 삭제

getType(): MIME 타입을 정의


*꼭 모든 메서드를 다 구현해야 하는 것은 아님. 데이터가 읽기전용이라면 query 메서드만 제공해도 됨.



제공된 컨텐츠 열기

ContentResolver 객체를 통해 정보요청

리졸버를 통해 CP의 DB를 마치 자신의 것인 양 액세스할 수 있음(물론 정의한 수준의 접근만)

ContentProvider가 검색되고, 실행중이 아니라면 시스템이 메모리에 올리므로 CP가 실행중이어야 할 필요는 없음

CP는 필요시 퍼미션을 요구할 수 있으며, 특정 응용프로그램만 데이터에 접근하도록 차단 가능



URI(Uniform Resource Identifier)

Content Provider 정보의 위치를 나타냄: 국제표준(RFC 2396)

scheme://authority/path/id


ex) content://학생관리프로바이더/학생/성적/학번/#



Content URI Matcher



복수 URI / 단수 URI

content://com.test.StudentsProvider/students

복수: 학생테이블 or 테이블에 저장된 모든 데이터를 의미하는 URI

복수에 대한 요청: DB의 대응되는 메서드를 그대로 호출


content://com.test.StudentsProvider/students/#

단수: 학생테이블에 저장된 특정 학생의 레코드를 의미하는 URI

단수에 대한 요청 - URI 끝에 있는 id를 읽어 where절에 조건을 추가



UriMatcher


URI를 분석하여 어떤 요청을 하는지 분석해주는 클래스



CP에서 활용


UriMatcher에서 얻은 정보로 CP내에서 복수/단수 URI 분기, 원하는 작업 수행







Content Observer

컨텐트 옵저버에서는 특정 URI에 해당하는 데이터가 변경되었는지 감시(System Service)

Provider를 구현하는 사람은 DB가 변경되는 부분에 notifyChanged() 함수를 넣어야 함

데이터 변경이 발생하면 Observer 안의 onChanged() 함수가 호출됨



정리하면

CP의 역할은 데이터 구조를 추상화하여 데이터를 저장/관리하는 작업과 데이터를 사용하는 작업을 분리하는 역할

클라이언트/서버 개념과 유사, 자기 자신의 패키지에서만 참조할 저장소라면 굳이 CP를 사용할 필요가 없음



출처: http://cafe.daum.net/superdroid

http://www.slideshare.net/ligbuf/contentprovider-adapter-activity-releation










*1  *···  *44  *45  *46  *47  *48  *49  *50  *51  *52  *···  *532 



категория
catchP!
AdSense
Carom & 3C
Android
Cook
CounterStrike
Cryptocurrency
Cycling
FIFA ONLINE 3
Music
Soccer
XBOX ONE
Stardew Valley
Storage
[ACTN] 액션코인 에어드랍 이벤트: 프리..
[THETA] 세타 토큰 마이이더월렛 추가방..
[무게실측] 랭킹 크리스(Ranking Chris)..
[CS:GO] 포레스트 콘픽: f0rest.cfg, 카..
[EB코인] 이비코인 에어드랍 이벤트: 텔..
[코인채굴] Sol/s, H/s, I/s란? kSol/s,..
건형 딥스바로 할 수 있는/없는 운동 동..
[판매완료] ASUS GTX960 Mini OC 2GB: 에..
자이언티 - 눈 (feat. 이문세) (Zion.T &..
171128, FTP 테스트: 3.72W/kg = 210W /..
배그 마우스 무가속 설정방법(PUBG Mouse..
[Review] GIANT TCR Advanced SL 0 & SLR..
[자이언트 에어캡] TCR SL 오버드라이브2..
[무게실측] 자이언트 SLR 0 클라이밍 휠..
얼레 앙리 후기, UL앙리 골모음/체감영상..
[판매완료] LG 노트북 Z360-GH6SK(i5, 12..
월베 호날두 4+3 은카도전, 케클 이운재..
[피팅노트] 자이언트 ISP 싯포스트 스페..
170914, FTP 테스트: 3.51W/kg = 199.8W..
CC클라위베르트 은카 후기, 41113 포메이..
170905, FTP 테스트: 3.49W/kg = 202.35W..
맨유 스케로 갈아타며: 3백 스탐, 긱스 &..
[무게실측] 프로팀 에어로 삭스 & 프로팀..
[무게실측] 라파 플라이웨이트 져지 & 프..
170722, FTP 테스트: 3.28W/kg = 193.8W..
도선사 라이딩 맛집. 도봉구 방학동 서래..
시마노 Di2 이튜브 펌웨어 업데이트(SM-B..
[피팅노트] TCR SL 0 170622
[무게실측] 페달마피아 져지/빕숏 키트(P..
[Fouriers] 푸리에 Di2 정션홀더 설치:..
count total 1,937,235, today 179, yesterday 598