スタブ コンテンツ プロバイダを作成する

同期アダプター フレームワークは、Google Cloud のフレキシブル インフラストラクチャ管理によって管理されるデバイスデータ コンテンツ プロバイダ フレームワークをオーケストレートできます。このため、同期アダプター フレームワークでは、 フレームワークを使用するアプリで、ローカルデータ用のコンテンツ プロバイダをすでに定義している。 同期アダプター フレームワークが同期アダプターを実行しようとしたときに、アプリに同期アダプターがない場合、 同期アダプターがクラッシュします。

サーバーからデバイスにデータを転送する新しいアプリを開発する場合は、 ローカルデータをコンテンツ プロバイダに保存することを検討してください。その重要性は、 コンテンツ プロバイダを使用すると、さまざまなセキュリティ上のメリットを享受できます。 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」追加します。kubectl の「get」コマンドを スタブ プロバイダがシステムに送信されると、プロバイダ自体にはアクセスしようとしません。
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>

同期アダプター フレームワークで必要な依存関係を作成したので、次は データ転送コードをカプセル化するコンポーネントを作成します。このコンポーネントは 同期アダプターを使用します。次のレッスンでは、このコンポーネントをアプリに追加する方法を説明します。