스터브 콘텐츠 제공업체 만들기

동기화 어댑터 프레임워크는 유연하고 매우 안전한 콘텐츠 제공자 프레임워크에서 관리하는 기기 데이터와 함께 작동하도록 설계되었습니다. 따라서 동기화 어댑터 프레임워크는 이 프레임워크를 사용하는 앱이 이미 로컬 데이터의 콘텐츠 제공자를 정의했을 것으로 예상합니다. 동기화 어댑터 프레임워크가 동기화 어댑터를 실행하려고 하고 앱에 콘텐츠 제공자가 없으면 동기화 어댑터가 비정상 종료됩니다.

서버에서 기기로 데이터를 전송하는 새 앱을 개발 중이라면 로컬 데이터를 콘텐츠 제공업체에 저장하는 것이 좋습니다. 콘텐츠 제공자는 동기화 어댑터에 중요한 것 외에도 다양한 보안 이점을 제공하며 Android 시스템의 데이터 저장소를 처리하도록 특별히 설계되었습니다. 콘텐츠 제공자 만들기에 관한 자세한 내용은 콘텐츠 제공자 만들기를 참고하세요.

그러나 로컬 데이터를 이미 다른 형식으로 저장하고 있다면 동기화 어댑터를 사용하여 데이터 전송을 처리할 수 있습니다. 콘텐츠 제공업체의 동기화 어댑터 프레임워크 요구사항을 충족하려면 스터브 콘텐츠 제공업체를 앱에 추가하세요. 스터브 제공업체에서는 콘텐츠 제공업체 클래스를 구현하지만 필요한 모든 메서드가 null 또는 0를 반환합니다. 스터브 제공업체를 추가하면 동기화 어댑터를 사용하여 선택한 저장 메커니즘에서 데이터를 전송할 수 있습니다.

앱에 이미 콘텐츠 제공업체가 있다면 스터브 콘텐츠 제공업체가 필요 없습니다. 이 경우 이 강의를 건너뛰고 동기화 어댑터 만들기 강의로 이동하세요. 아직 콘텐츠 제공업체가 없다면 이 과정에서는 동기화 어댑터를 프레임워크에 연결할 수 있는 스터브 콘텐츠 제공업체를 추가하는 방법을 보여줍니다.

스터브 콘텐츠 제공업체 추가

앱에 스터브 콘텐츠 제공업체를 만들려면 ContentProvider 클래스를 확장하고 필요한 메서드를 스터브하세요. 다음 스니펫은 스터브 제공업체를 만드는 방법을 보여줍니다.

Kotlin

/*
 * Define an implementation of ContentProvider that stubs out
 * all methods
 */
class StubProvider : ContentProvider() {
    /*
     * Always return true, indicating that the
     * provider loaded correctly.
     */
    override fun onCreate(): Boolean  = true

    /*
     * Return no type for MIME type
     */
    override fun getType(uri: Uri): String?  = null

    /*
     * query() always returns no results
     *
     */
    override fun query(
            uri: Uri,
            projection: Array<String>,
            selection: String,
            selectionArgs: Array<String>,
            sortOrder: String
    ): Cursor?  = null

    /*
     * insert() always returns null (no URI)
     */
    override fun insert(uri: Uri, values: ContentValues): Uri? = null

    /*
     * delete() always returns "no rows affected" (0)
     */
    override fun delete(uri: Uri, selection: String, selectionArgs: Array<String>): Int = 0

    /*
     * update() always returns "no rows affected" (0)
     */
    override fun update(
            uri: Uri,
            values: ContentValues,
            selection: String,
            selectionArgs: Array<String>
    ): Int = 0
}

Java

/*
 * Define an implementation of ContentProvider that stubs out
 * all methods
 */
public class StubProvider extends ContentProvider {
    /*
     * Always return true, indicating that the
     * provider loaded correctly.
     */
    @Override
    public boolean onCreate() {
        return true;
    }
    /*
     * Return no type for MIME type
     */
    @Override
    public String getType(Uri uri) {
        return null;
    }
    /*
     * query() always returns no results
     *
     */
    @Override
    public Cursor query(
            Uri uri,
            String[] projection,
            String selection,
            String[] selectionArgs,
            String sortOrder) {
        return null;
    }
    /*
     * insert() always returns null (no URI)
     */
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }
    /*
     * delete() always returns "no rows affected" (0)
     */
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }
    /*
     * update() always returns "no rows affected" (0)
     */
    public int update(
            Uri uri,
            ContentValues values,
            String selection,
            String[] selectionArgs) {
        return 0;
    }
}

매니페스트에서 제공업체 선언

동기화 어댑터 프레임워크는 앱이 앱 매니페스트에서 제공자를 선언했는지 검사하여 앱에 콘텐츠 제공자가 있는지 확인합니다. 매니페스트에서 스터브 제공업체를 선언하려면 다음 속성이 있는 <provider> 요소를 추가합니다.

android:name="com.example.android.datasync.provider.StubProvider"
스터브 콘텐츠 제공업체를 구현하는 클래스의 정규화된 이름을 지정합니다.
android:authorities="com.example.android.datasync.provider"
스터브 콘텐츠 제공업체를 식별하는 URI 권한입니다. 이 값에 '.provider'라는 문자열을 추가하여 앱의 패키지 이름으로 만드세요. 스터브 제공업체를 시스템에 선언하더라도 제공업체 자체에 액세스하려는 시도는 없습니다.
android:exported="false"
다른 앱이 콘텐츠 제공자에 액세스할 수 있는지 결정합니다. 스터브 콘텐츠 제공업체의 경우 다른 앱이 제공업체를 보도록 허용할 필요가 없으므로 값을 false로 설정합니다. 이 값은 동기화 어댑터 프레임워크와 콘텐츠 제공자 간의 상호작용에 영향을 주지 않습니다.
android:syncable="true"
제공업체를 동기화할 수 있음을 나타내는 플래그를 설정합니다. 이 플래그를 true로 설정하면 코드에서 setIsSyncable()를 호출하지 않아도 됩니다. 이 플래그를 사용하면 동기화 어댑터 프레임워크가 콘텐츠 제공업체와의 데이터 전송을 실행할 수 있지만 명시적으로 전송하는 경우에만 전송이 이루어집니다.

다음 스니펫에서는 앱 매니페스트에 <provider> 요소를 추가하는 방법을 보여줍니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.network.sync.BasicSyncAdapter"
    android:versionCode="1"
    android:versionName="1.0" >
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
    ...
    <provider
        android:name="com.example.android.datasync.provider.StubProvider"
        android:authorities="com.example.android.datasync.provider"
        android:exported="false"
        android:syncable="true"/>
    ...
    </application>
</manifest>

동기화 어댑터 프레임워크에 필요한 종속 항목을 만들었으므로 이제 데이터 전송 코드를 캡슐화하는 구성요소를 만들 수 있습니다. 이 구성요소를 동기화 어댑터라고 합니다. 다음 과정에서는 이 구성요소를 앱에 추가하는 방법을 안내합니다.