안드로이드 4대 컴포넌트 중 하나로,
데이터를 관리하고 다른 애플리케이션에 데이터를 제공해주는 컴포넌트이다.
폰 안의 여러 앱, 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이기 때문) 번호의 정보를 가져온것을 확인