본문 바로가기
Android/Android Core

[Android/Kotlin] ContentProvider란 무엇인가?

by quessr 2024. 9. 25.

 

Android에서 ContentProvider는 앱 간 데이터(예: 파일, 데이터베이스)를 공유하는 컴포넌트입니다.
이는 여러 앱에서 접근할 수 있는 데이터 저장소 역할을 하며, 보안 및 권한 관리 기능을 포함합니다.

ContentProvider를 통해 한 앱에서 다른 앱의 데이터를 안전하게 읽고 쓸 수 있습니다.

ContentProvider의 사용 예시

  • 데이터베이스 공유: 데이터베이스에 저장된 정보를 다른 앱과 공유하고자 할 때.
  • 데이터 접근 용이성: 외부 앱에서 자신의 데이터를 쉽게 접근하도록 하고자 할 때.

Manifest에 정의해야 하는 내용

ContentProvider를 사용하기 위해 AndroidManifest.xml에 몇 가지 설정을 추가해야 합니다.

ContentProvider 제공하는 쪽 (제공하는 앱)

Permission: ContentProvider에 접근하기 위한 권한을 정의합니다.

<permission
    android:name="com.fbm.contentprovider.READ_DATABASE"
    android:protectionLevel="normal" />

 

Provider: 실제 ContentProvider를 등록합니다.

<provider
    android:name=".data.db.FavoriteProvider"
    android:authorities="com.fbm.contentprovider"
    android:exported="true" />

ContentProvider 제공받는 쪽 (소비하는 앱)

Permission: ContentProvider에 접근하기 위한 권한을 요청합니다.

<uses-permission android:name="com.fbm.contentprovider.READ_DATABASE" />
Queries: ContentProvider를 쿼리하기 위한 설정을 추가합니다.
<queries>
    <package android:name="com.fbm.contentprovider" />
</queries>

ContentProvider 및 ContentResolver 예시

 

query 메서드는 외부에서 데이터를 요청할 때 호출되는 핵심 메서드입니다. 특정 URI에 대한 데이터를 검색하고, 결과를 Cursor 객체로 반환합니다. 이를 통해 다른 앱이나 컴포넌트는 ContentProvider에 저장된 데이터를 쉽게 읽을 수 있습니다.

제공하는 쪽

ContentProvider를 제공하는 앱에서는 ContentProvider 클래스를 구현해야 합니다. 이 클래스 내에서 데이터를 저장하고 검색하는 로직을 정의합니다.

ContentProvider 예시

class FavoriteProvider : ContentProvider() {
    
    override fun onCreate(): Boolean {
        // 데이터베이스 초기화
        return true
    }

    override fun query(
        uri: Uri,
        projection: Array<out String>?,
        selection: String?,
        selectionArgs: Array<out String>?,
        sortOrder: String?
    ): Cursor? {
        // 데이터 쿼리 로직
    }

    // 기타 메서드 (insert, update, delete, getType 등)
}

 

query 메서드 시그니처

 

override fun query(
    uri: Uri,
    projection: Array<out String>?,
    selection: String?,
    selectionArgs: Array<out String>?,
    sortOrder: String?
): Cursor?

 

매개변수 설명

  • uri: 데이터의 위치를 나타내는 고유한 식별자. 이 URI를 통해 어떤 데이터에 접근할지를 결정합니다.
  • projection: 반환할 데이터의 열(column)을 지정하는 배열. 필요한 데이터만 가져오도록 하여 성능을 개선할 수 있습니다. null로 지정하면 모든 열이 반환됩니다.
  • selection: 검색할 데이터를 필터링하는 데 사용할 SQL WHERE 절을 지정하는 문자열. 특정 조건에 맞는 데이터만 반환하도록 제한할 수 있습니다.
  • selectionArgs: selection에서 사용된 플레이스홀더(예: ?)를 대체할 값을 지정하는 배열. 이를 통해 동적으로 조건을 설정할 수 있습니다.
  • sortOrder: 결과 데이터를 정렬할 방식을 지정하는 문자열. 예를 들어, "title ASC"를 지정하면 제목을 오름차순으로 정렬합니다.

반환 값

  • Cursor: 쿼리 결과를 포함하는 Cursor 객체를 반환합니다. Cursor를 사용하여 결과 데이터를 탐색하고 필요한 정보를 추출할 수 있습니다. 만약 조건에 맞는 데이터가 없으면 null을 반환할 수 있습니다.

사용 예시

아래는 모든 사진 정보를 가져오는 예시입니다.

val cursor = contentResolver.query(
    FavoriteContract.CONTENT_URI, 
    null, // 모든 열을 반환
    null, 
    null, 
    null
)

cursor?.use {
    while (it.moveToNext()) {
        val id = it.getString(it.getColumnIndex("id"))
        val title = it.getString(it.getColumnIndex("title"))
        val description = it.getString(it.getColumnIndex("description"))
        
        Log.d("Photo", "ID: $id, Title: $title, Description: $description")
    }
}

 

ContentResolver 예시

class ContentResolverHelper(private val context: Context) {

    private val contentResolver: ContentResolver = context.contentResolver

    fun getAllItems() {
        val cursor = contentResolver.query(FavoriteContract.CONTENT_URI, null, null, null, null)

        cursor?.use {
            // 데이터 처리 로직
        }
    }

    // 기타 메서드 (insertItem, removeItem 등)
}

결론

ContentProvider는 앱이 서로 데이터를 쉽게 공유할 수 있도록 도와주는 유용한 도구입니다.
제공하는 쪽에서는 ContentProvider 클래스를 구현하고, 제공받는 쪽에서는 ContentResolver를 사용하여 데이터를 요청합니다.
query 메서드를 통해 필요한 데이터를 선택적으로 검색할 수 있으며, 앱 간 데이터 통신을 원활하게 합니다. 이를 효과적으로 활용하면 사용자에게 더 나은 경험을 제공할 수 있습니다.

반응형