240205 TIL #313 Android #25 콘텐츠 프로바이더

김춘복·2024년 2월 4일
0

TIL : Today I Learned

목록 보기
313/571

Today I Learned

오늘은 콘텐츠 프로바이더를 공부했다.


Contents Provider

앱끼리 데이터를 연동하는 컴포넌트.

  • 다른 앱의 데이터를 사용할 때 콘텐츠 프로바이더를 사용한다.
    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.")
    }
}
  • 프로바이더도 컴포넌트이므로 매니페스트에 등록해야 한다.
    단, name 뿐만 아니라 authorities도 반드시 선언해야 한다.
    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)
  • ContentResolver의 함수
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)
  • 첫번째 매개변수인 Uri 객체의 URL 문자열은 프로토콜명과 콘텐츠 프로바이더의 식별자로 등록된 authorities값이다

profile
Backend Dev / Data Engineer

0개의 댓글