오늘은 콘텐츠 프로바이더를 공부했다.
앱끼리 데이터를 연동하는 컴포넌트.
다른 앱의 데이터를 사용할 때 콘텐츠 프로바이더를 사용한다.
ex) 주소록의 주소, 갤러리의 사진
내 앱의 데이터를 공유하고자 할 때도 사용한다.
ContentProvider 클래스를 상속한다.
onCreate(), getType(), query(), insert(), update(), delete() 함수를 재정의해야 한다.
insert, update, delete 함수를 이용해 외부의 앱에서 내 앱의 저장소에 데이터를 삽입, 수정, 삭제가 가능해지는데, 이를 원치 않으면 함수만 정의해두되 함수의 내용을 작성하지 않으면 된다.
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.")
}
}
authorities
도 반드시 선언해야 한다. <provider
android:name=".MyContentProvider"
android:authorities="com.example.test_provider"
android:enabled="true"
android:exported="true"></provider>
콘텐츠 프로바이더는 인텐트와 상관없이 작동한다. 필요한 순간에 시스템에서 자동으로 생성해 사용하므로 함수만 정의해두면 된다.
외부 앱에서 프로바이더를 사용하려면 매니페스트에 해당 앱에 관한 패키지 공개 설정을 해야한다.
대상 앱의 패키지 명을 <package> 태그로 명시하거나, <provider>의 autholities 속성을 선언하거나 둘 중 하나만 하면 된다.
<queries>
<package android:name="com.example.test_outter" />
or
<provider android:authorities="com.example.test_provider" />
</queries>
ContentResolver
객체를 사용한다.contentResolver.query(
Uri.parse("content://com.example.test_provider"),
null, null, null, null)
public final int delete(Uri url, String where, String[] selectionArgs)
public final Uri insert(Uri url, ContentValues values)
public final Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)
public final int update(Uri uri, ContentValues values, String where,String[] selectionArgs)