외로운 Nova의 작업실

안드로이드 앱 프로그래밍 - 31(콘텐츠 프로바이더 이해하기) 본문

Programming/Kotlin - Android

안드로이드 앱 프로그래밍 - 31(콘텐츠 프로바이더 이해하기)

Nova_ 2023. 2. 24. 11:03

- 콘텐츠 프로바이더

콘텐츠 프로바이더는 앱끼리 데이터를 연동하는 컴포넌트입니다. 다른앱의 데이터를 사용할때 콘첸츠 프로바이더를 이용합니다. 이때 데이터는 대상 앱의 데이터베이스나 파일 또는 앱에 할당된 메모리에 있습니다. 콘텐츠 프로바이더를 이용하면 이런 저장소에 있는 데이터를 가져오거나 수정할 수 있습니다.

 

- 콘텐츠 프로바이더 만들기

먼저 다른 앱들이 저의 앱의 저장소를 사용할 수 있도록 저의 앱에 콘텐츠 프로바이더를 만들어보도록 하겠습니다.

 

<콘텐츠 프로바이더 작성하기>

먼저 외부앱이 사용할 수 있는 함수들을 만들어줍니다. 아래는 MyContentProvider.kt 파일입니다.

class MyContentProvider: ContentProvider() {
    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int {
        TODO("Not yet implemented")
    }

    override fun getType(uri: Uri): String? {
        TODO("Not yet implemented")
    }

    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        TODO("Not yet implemented")
    }

    override fun onCreate(): Boolean {
        TODO("Not yet implemented")
    }

    override fun query(
        uri: Uri,
        projection: Array<out String>?,
        selection: String?,
        selectionArgs: Array<out String>?,
        sortOrder: String?
    ): Cursor? {
        TODO("Not yet implemented")
    }

    override fun update(
        uri: Uri,
        values: ContentValues?,
        selection: String?,
        selectionArgs: Array<out String>?
    ): Int {
        TODO("Not yet implemented")
    }

onCreate() 함수는 콘텐츠 프로바이더의 생명주기 함수라서 시스템이 콘텐츠 프로바이더 객체를 생성할때 자동으로 호출됩니다. 그외 query(), insert(), update(), delete() 함수등은 외부 앱이 사용가능한 함수들입니다.

 

<매니페스트에 콘텐츠 프로바이더 등록>

콘텐츠 프로바이더는 안드로이드 컴포넌트이므로 매니페스트에 등록해야합니다. 그런데 다른 컴포넌트와 달리 name 속성뿐만아니라 authorities 속성도 반드시 선언해야합니다. authorities속성은 외부에서 이 콘텐츠를 이용할때 식별값으로 사용되는 문자열입니다. 아래는 매니페스트 파일의 일부입니다.

        <provider
            android:authorities="eom.example.ContentProvider"
            android:name=".MyContentProvider"
            android:enabled="true"
            android:exported="true"></provider>

- 외부앱에서 콘텐츠 프로바이더 사용하기

내부앱에서 콘텐츠 프로바이더를 만들었으니 외부앱에서 콘텐츠 프로바이더를 사용하는 방법에대해서 알아보겠습니다.

 

<패키지 공개설정>

먼저 외부앱에서 사용하려면 외부앱은 패키지 어떤 프로바이더를 사용할건지 시스템에게 알려줘야합니다. 이때 매니페스트파일에 <package> 태그로 명시합니다.

    <queries>
        <package android:name="com.example.ContentProvider"/>
    </queries>

 

<실제 콘텐츠 프로바이더 사용하기>

패키지를 공개설정했다면 시스템은 contentResolver 객체를 할당해줍니다. 따라서 contentResolver 객체로 데이터를 조작합니다. 아래는 예시입니다.

        contentResolver.query((Uri.parse("content://com.example.ContentProvider"), 
            null, null, null, null)

 

사용할 수 있는 함수들은 delete, insert, query, update 함수등이 있습니다. 이 함수들의 첫번째 매개변수는 Uri 객체인데, Uri 객체의 URL 문자열은 프로토콜 명과 내부앱의 콘텐츠 프로바이더의 식별자로 등록된 authorities 값이여야합니다. URL의 경우 경로를 줄 수 있는데, 경로의 끝이 문자이면 데이터 전체를 의미하며, 경로의 끝이 숫자이면 index값으로 식별되는 데이터 1개를 가져오겠다는 의미입니다. 추가로 query 함수는 데이터를 가져오는 함수입니다.

Comments