Stub-Inhaltsanbieter erstellen

Das Framework für Synchronisierungsadapter wurde für die Arbeit mit Gerätedaten entwickelt, die vom flexiblen und hochsicheren Framework für Contentanbieter verwaltet werden. Aus diesem Grund erwartet das Synchronisierungsadapter-Framework, dass eine App, die das Framework verwendet, bereits einen Contentanbieter für ihre lokalen Daten definiert hat. Wenn das Synchronisierungsadapter-Framework versucht, Ihren Synchronisierungsadapter auszuführen, und Ihre App keinen Contentanbieter hat, stürzt Ihr Synchronisierungsadapter ab.

Wenn du eine neue App entwickelst, mit der Daten von einem Server auf das Gerät übertragen werden, solltest du die lokalen Daten unbedingt bei einem Contentanbieter speichern. Neben ihrer Bedeutung für Synchronisierungsadapter bieten Contentanbieter eine Vielzahl von Sicherheitsvorteilen und wurden speziell für die Speicherung von Daten auf Android-Systemen entwickelt. Weitere Informationen zum Erstellen eines Contentanbieters finden Sie unter Contentanbieter erstellen.

Wenn Sie lokale Daten jedoch bereits in einer anderen Form speichern, können Sie für die Datenübertragung einen Synchronisierungsadapter verwenden. Fügen Sie Ihrer App einen Stub-Inhaltsanbieter hinzu, um die Anforderungen des Synchronisierungsadapter-Frameworks für einen Inhaltsanbieter zu erfüllen. Ein Stub-Anbieter implementiert die Klasse des Inhaltsanbieters, alle erforderlichen Methoden geben jedoch null oder 0 zurück. Wenn Sie einen Stub-Anbieter hinzufügen, können Sie einen Synchronisierungsadapter verwenden, um Daten aus einem beliebigen Speichermechanismus Ihrer Wahl zu übertragen.

Wenn Sie bereits einen Contentanbieter in Ihrer App haben, benötigen Sie keinen Stub-Contentanbieter. In diesem Fall können Sie diese Lektion überspringen und mit der Lektion Synchronisierungsadapter erstellen fortfahren. Wenn Sie noch keinen Contentanbieter haben, erfahren Sie in dieser Lektion, wie Sie einen Stub-Inhaltsanbieter hinzufügen, um Ihren Synchronisierungsadapter an das Framework anzuschließen.

Stub-Inhaltsanbieter hinzufügen

Erweitern Sie die Klasse ContentProvider und rufen Sie die erforderlichen Methoden auf, um einen Stub-Inhaltsanbieter für Ihre Anwendung zu erstellen. Das folgende Snippet zeigt, wie Sie den Stub-Anbieter erstellen:

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;
    }
}

Anbieter im Manifest deklarieren

Das Synchronisierungsadapter-Framework prüft, ob Ihre App einen Contentanbieter hat. Dazu wird geprüft, ob Ihre App in ihrem App-Manifest einen Anbieter deklariert hat. Um den Stub-Anbieter im Manifest zu deklarieren, fügen Sie ein <provider>-Element mit den folgenden Attributen hinzu:

android:name="com.example.android.datasync.provider.StubProvider"
Gibt den voll qualifizierten Namen der Klasse an, die den Stub-Inhaltsanbieter implementiert.
android:authorities="com.example.android.datasync.provider"
Eine URI-Zertifizierungsstelle, die den Stub-Inhaltsanbieter identifiziert. Verwenden Sie diesen Wert als Paketnamen der Anwendung und fügen Sie den String „.provider“ hinzu. Obwohl Sie Ihren Stub-Anbieter im System deklarieren, wird nicht versucht, auf den Anbieter selbst zuzugreifen.
android:exported="false"
Legt fest, ob andere Apps auf den Contentanbieter zugreifen können. Legen Sie für Ihren Stub-Inhaltsanbieter den Wert auf false fest, da andere Anwendungen nicht auf den Anbieter zugreifen müssen. Dieser Wert hat keinen Einfluss auf die Interaktion zwischen dem Synchronisierungsadapter-Framework und dem Contentanbieter.
android:syncable="true"
Legt ein Flag fest, das angibt, dass der Anbieter synchronisierbar ist. Wenn Sie dieses Flag auf true setzen, müssen Sie setIsSyncable() in Ihrem Code nicht aufrufen. Das Flag ermöglicht dem Sync Adapter-Framework, Datenübertragungen mit dem Contentanbieter vorzunehmen. Übertragungen erfolgen jedoch nur, wenn Sie dies explizit tun.

Das folgende Snippet zeigt, wie Sie dem App-Manifest das <provider>-Element hinzufügen:

<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>

Nachdem Sie nun die für das Synchronisierungsadapter-Framework erforderlichen Abhängigkeiten erstellt haben, können Sie die Komponente erstellen, die Ihren Datenübertragungscode enthält. Diese Komponente wird als Synchronisierungsadapter bezeichnet. In der nächsten Lektion erfahren Sie, wie Sie Ihrer App diese Komponente hinzufügen.