[안드로이드] ContentProvider

Chloe Choi·2021년 1월 14일
0

안드로이드

목록 보기
3/17

ContentProvider

안드로이드 4대 컴포넌트 중 하나로,
데이터를 관리하고 다른 애플리케이션에 데이터를 제공해주는 컴포넌트이다.

ContentResolver

폰 안의 여러 앱, Provider를 관리하고 통제하는 중재자 역할
CURD 함수를 제공해 다른 앱의 DB를 조작할 수 있다.

구조

예제

휴대폰에 저장된 번호 정보를 가져오는 예제 코드를 작성해보겠다.

#1. MyContactsDataSource
ContentResolver를 통해 지정한 URI의 데이터를 받아온다(Cursor). 그리고 받아온 행 정보를 사용할 데이터로 조작한다. 참고로 안드로이드 플랫폼에서 제공하는 ContentProvider는 관계형 데이터베이스 모델에 기초해 테이블 집합으로 데이터를 노출하기 때문에 Cursor는 행의 목록을 갖게 된다!

val result: MutableList<MyContact> = mutableListOf()

val cursor = contentResolver.query(
    ContactsContract.Data.CONTENT_URI,
    arrayOf(
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
    ),
    null,
    null,
    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
)

cursor?.let {
    cursor.moveToFirst()
    while (!cursor.isAfterLast) {
        result.add(
            MyContact(
                cursor.getString(0),
                cursor.getString(1).toContactImageUri()
            )
        )
        cursor.moveToNext()
    }
    cursor.close()
}

return result.toList()

query() 메소드의 파라미터는 (원하는 데이터를 가져올 주소, 가져울 칼럼의 이름 목록, where 절, selection 에서 ?로 표시될 곳에 들어갈 데이터, order by)로 구성한다.

#2. MyContactsRepository
비동기 처리를 위해 코루틴으로 MyContactsDataSource의 메소드 호출

suspend fun fetchContacts(): List<MyContact> = withContext(myDispatcher) {
    source.fetchContacts()
}

위 두 부분을 앱 내에 작성해주면 된다! 전체 코드는 다음 ContentProviderPractice - github.com/cchloe2311에서 확인해주세요~

구현 결과

[주소록 앱] -> 저장된 4개의 연락처 확인

[ContentProviderPrctice 앱] -> 주소록 내 모든(query 내 where 절이 null이기 때문) 번호의 정보를 가져온것을 확인

ref.

https://jossypaul.medium.com/loading-data-from-contentprovider-using-coroutines-and-livedata-34aa5e79b8ba

profile
똑딱똑딱

0개의 댓글