앱끼리 데이터를 연동하는 컴포넌트이다.
앱을 개발하면서 다른 앱의 데이터를 사용할 때 콘텐츠 프로바이더를 이용한다.
class MyContentProvider : ContentProvider() {
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int {
TODO("Implement this to handle requests to delete one or more rows")
}
override fun getType(uri: Uri): String? {
TODO(
"Implement this to handle requests for the MIME type of the data" +
"at the given URI"
)
}
override fun insert(uri: Uri, values: ContentValues?): Uri? {
TODO("Implement this to handle requests to insert a new row.")
}
override fun onCreate(): Boolean {
TODO("Implement this to initialize your content provider on startup.")
}
override fun query(
uri: Uri, projection: Array<String>?, selection: String?,
selectionArgs: Array<String>?, sortOrder: String?
): Cursor? {
TODO("Implement this to handle query requests from clients.")
}
override fun update(
uri: Uri, values: ContentValues?, selection: String?,
selectionArgs: Array<String>?
): Int {
TODO("Implement this to handle requests to update one or more rows.")
}
}
ContentProvider 클래스를 상속받아서 작성한다.
onCreate(), getType(), query(), insert(), update(), delete() 함수를 재정의해서 작성한다.
<provider
android:name=".MyContentProvider"
android:authorities="com.example.test_provider"
android:enabled="true"
android:exported="true">
</provider>
콘텐츠 프로바이더도 안드로이드 컴포넌트이므로 매니페스트에 등록해야 한다.
authorities 속성도 반드시 선언해야 한다.
해당 속성은 외부에서 콘텐츠 프로바이더를 이용할 때 식별값으로 사용되는 문자열이다.
<queries>
<!-- 둘중 하나만 선언하면 된다. -->
<!-- <provider android:authorities="com.example.test_provider" /> -->
<package android:name="com.example.name"/>
</queries>
외부 앱에서 콘텐츠 프로바이더를 사용하려면 매니페스트에 해당 앱에 관한 패키지 공개 설정을 해줘야 한다.
contentResolver.query(
Uri.parse("content://com.example.test_provider"),
null, null, null, null)
시스템에 등록된 콘텐츠 프로바이더를 사용할 때는 ContentResolver 객체를 이용한다.