ContentProvider를 이용한 앱 간 데이터 공유(ft. Room db) - 개념정의 [1]

Heathcliff·2022년 8월 12일

Content Provider

안드로이드를 처음에 공부하면 안드로이드 4대 컴포넌트에 관한 내용이 있다.

  • Activity
  • Service
  • Broadcast Receiver
  • Content Provider

그 중 하나인 Cotent Provider는 어플케이션 사이에서 파일 및 데이터를 공유하는 역할을 갖는다.

어떠한 앱이 다른 앱의 데이터에 직접 접근할 수 없기에 무조건 Content Provider를 통해 다른 앱의 데이터에 접근해야 한다.

파일을 공유하는 대표적인 사례로 SNS앱을 사용해서 사진파일을 업로드 하는 경우 갤러리 앱에 접근하여 사진 파일을 가져오는 경우가 있다.


앱 간 데이터 공유

편의상 아래와 같이 두자기 앱을 정의하자

  • A앱 : 데이터를 공유하려는 앱
  • B앱 : A앱의 데이터를 공유받으려는 앱

데이터를 공유하는 경우 다른앱이 자신의 앱에 접근하여 데이터 조회 및 수정할 권한을 준다.
즉 B앱에서 A앱의 데이터에 기본적인 CRUD(생성, 읽기, 갱신, 삭제)가 가능하다.


Content Resolver

다른 앱의 데이터에 접근하려면 앱에서 URI를 이용하여 Content Resolver를 통해 다른 앱의 Content Provider 에게 데이터를 요청한다.
Content Provider는 요청받은 URI를 확인 후 내부 DB에 접근하여 조회한 데이터를 Content Resolver에게 전달한다.

ContentResolver에서는 query(조회), insert, update, delete 작업이 가능하다.


*CRUD와 별개로 ContentProvider 에서 Custom Method를 생성하여 B앱이 ContentResolver를 통해 A앱의 커스텀 메서드를 호출하고 return 값을 Bundle로 받을 수도 있다.*

아래는 Content Resolver를 이용하여 CRUD 관련 query, insert 메서드 호출, 커스텀메서드 호출을 위한 call 메서드를 호출하는 예이다.

val contentURI = Uri.parse("content://com.study.providera.MyContentProvider")

// query
contentResolver.query(contentURI, null, null, null, null)

// insert
val values = ContentValues()
values.put("title", "제목")
values.put("content", "내용")
contentResolver.insert(contentURI, contentValues)

// Custom Method
val bundle: Bundle? = contentResolver.call(contentURI, "{메소드명}", null, null)

...
    

URI 구조

ContentResolver는 URI를 이용하여 ContentProvider에 데이터를 요청한다고 했다. 이때 URI 구조에 대해서 알아보자.

위 ContentResolver 예시 코드에서 URI를 정의한 내용을 보면

val contentURI = Uri.parse("content://com.study.providera.MyContentProvider")

URI 예시 - content://com.study.providera.MyContentProvider/item/1
(scheme) ( authority ) ( path/id )

  • Scheme : 컨텐트 프로바이더를 사용 한다는 고정적인 스키마 (content)
  • Authority : Content Provider를 구분하는 용도로 사용. 보통 앱패키지명.provider명 으로 생성한다.
  • Path : 데이터의 경로, DB 테이블을 의미한다.
  • Id : DB에서 특정 레코드를 참조할 경우 사용.


앱 간 데이터를 공유하는 예제는 다음 장에서 이어서 설명하도록 한다.
profile
Android Developer

0개의 댓글