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>
<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 메서드를 통해 필요한 데이터를 선택적으로 검색할 수 있으며, 앱 간 데이터 통신을 원활하게 합니다. 이를 효과적으로 활용하면 사용자에게 더 나은 경험을 제공할 수 있습니다.
'Android > Android Core' 카테고리의 다른 글
[Android/Kotlin] Bluetooth Notify 기능 구현: CCCD 설정과 알림 활성화 방법 (0) | 2024.10.25 |
---|---|
[Android/Kotlin] Kotlin에서 abstract class와 open class의 차이점 (0) | 2024.10.04 |
[Android/Kotlin] Kotlin에서 @Parcelize를 사용하여 객체 전달하기 (0) | 2024.07.25 |
[Android/Kotlin] DiffUtil과 ListAdapter를 활용한 효율적인 RecyclerView 업데이트 (0) | 2024.07.01 |
[Android/Kotlin] 왜 notifyDataSetChanged 대신 DiffUtil을 사용해야 하는가? (0) | 2024.06.28 |