Créer un fournisseur de contenu bouchon
Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
La structure de l'adaptateur de synchronisation est conçue pour fonctionner avec les données des appareils gérées par le gestionnaire
d'un fournisseur de contenu hautement sécurisé. Pour cette raison, le framework d'adaptateur de synchronisation attend
qu'une application qui utilise ce framework a déjà défini un fournisseur de contenu pour ses données locales.
Si le framework d'adaptateur de synchronisation tente d'exécuter votre adaptateur de synchronisation et que votre application ne dispose pas d'un
fournisseur de contenu, votre adaptateur de synchronisation plante.
Si vous développez une nouvelle application qui transfère des données d'un serveur à un appareil, vous devez
envisagez de stocker les données locales
auprès d'un fournisseur de contenu. Outre leur importance pour
adaptateurs de synchronisation, les fournisseurs de contenu offrent de nombreux avantages en termes de sécurité.
conçu pour gérer le stockage
de données sur les systèmes Android. Pour en savoir plus sur la création de contenu
consultez la page Créer un fournisseur de contenu.
Toutefois, si vous stockez déjà des données locales sous une autre forme, vous pouvez toujours utiliser un outil de synchronisation
pour gérer le transfert de données. Pour satisfaire aux exigences de framework de l'adaptateur de synchronisation pour une
fournisseur de contenu, ajoutez un fournisseur de contenu bouchon à votre application. Un fournisseur de bouchon implémente le
du fournisseur de contenu, mais toutes les méthodes requises renvoient null
ou 0
. Si vous
ajoutez un fournisseur de bouchon, vous pouvez ensuite utiliser un adaptateur de synchronisation pour transférer les données depuis n'importe quel
mécanisme de votre choix.
Si vous avez déjà un fournisseur de contenu dans votre application, vous n'avez pas besoin de fournisseur de contenu bouchon.
Dans ce cas, vous pouvez ignorer cette leçon et passer à la leçon suivante.
Créer un adaptateur de synchronisation Si vous ne disposez pas encore
fournisseur de contenu, cette leçon vous explique comment ajouter un fournisseur de contenu bouchon qui vous permet
Connectez votre adaptateur de synchronisation au framework.
Ajouter un fournisseur de contenu bouchon
Pour créer un fournisseur de contenu bouchon pour votre application, développez la classe
ContentProvider
et bouchons les méthodes requises. Les éléments suivants :
l'extrait de code suivant vous explique comment créer le fournisseur de bouchon:
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;
}
}
Déclarer le fournisseur dans le fichier manifeste
Le framework de l'adaptateur de synchronisation vérifie que votre application dispose d'un fournisseur de contenu en vérifiant que
app a déclaré un fournisseur dans son fichier manifeste. Pour déclarer le fournisseur de bouchon dans
le fichier manifeste, ajoutez un élément <provider>
avec les attributs suivants:
-
android:name="com.example.android.datasync.provider.StubProvider"
-
Spécifie le nom complet de la classe qui implémente le fournisseur de contenu bouchon.
-
android:authorities="com.example.android.datasync.provider"
-
Autorité d'URI qui identifie le fournisseur de contenu bouchon. Utilisez cette valeur comme
nom du package avec la chaîne ".provider" qui lui est ajoutée. Même si vous déclarez
bouchon au système, rien ne tente
d'accéder au fournisseur lui-même.
-
android:exported="false"
-
Détermine si d'autres applications peuvent accéder au fournisseur de contenu. Pour le contenu de votre bouchon
fournisseur, définissez la valeur sur
false
, car il n'est pas nécessaire d'autoriser les autres applications à voir
le fournisseur. Cette valeur n'affecte pas l'interaction entre le framework de l'adaptateur de synchronisation
et le fournisseur de contenu.
-
android:syncable="true"
-
Définit une option indiquant que le fournisseur peut être synchronisé. Si vous définissez cet indicateur sur
true
, vous n'avez pas besoin d'appeler setIsSyncable()
dans votre code. L'indicateur permet au framework d'adaptateur de synchronisation d'effectuer
les transferts avec le fournisseur de contenu. En revanche, les transferts n'ont lieu que si vous les effectuez explicitement.
L'extrait de code suivant vous montre comment ajouter le
<provider>
au fichier manifeste de l'application:
<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>
Maintenant que vous avez créé les dépendances requises par le framework d'adaptateur de synchronisation, vous pouvez
créez le composant qui encapsule votre code de transfert de données. Ce composant est appelé
adaptateur de synchronisation. La leçon suivante vous explique comment ajouter ce composant à votre application.
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/07/27 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/07/27 (UTC)."],[],[],null,["# Create a stub content provider\n\nThe sync adapter framework is designed to work with device data managed by the flexible and\nhighly secure content provider framework. For this reason, the sync adapter framework expects\nthat an app that uses the framework has already defined a content provider for its local data.\nIf the sync adapter framework tries to run your sync adapter, and your app doesn't have a\ncontent provider, your sync adapter crashes.\n\n\nIf you're developing a new app that transfers data from a server to the device, you should\nstrongly consider storing the local data in a content provider. Besides their importance for\nsync adapters, content providers offer a variety of security benefits and are specifically\ndesigned to handle data storage on Android systems. To learn more about creating a content\nprovider, see [Creating a Content Provider](/guide/topics/providers/content-provider-creating).\n\n\nHowever, if you're already storing local data in another form, you can still use a sync\nadapter to handle data transfer. To satisfy the sync adapter framework requirement for a\ncontent provider, add a stub content provider to your app. A stub provider implements the\ncontent provider class, but all of its required methods return `null` or `0`. If you\nadd a stub provider, you can then use a sync adapter to transfer data from any storage\nmechanism you choose.\n\n\nIf you already have a content provider in your app, you don't need a stub content provider.\nIn that case, you can skip this lesson and proceed to the lesson\n[Creating a Sync Adapter](/training/sync-adapters/creating-sync-adapter). If you don't yet have a\ncontent provider, this lesson shows you how to add a stub content provider that allows you to\nplug your sync adapter into the framework.\n\nAdd a stub content provider\n---------------------------\n\n\nTo create a stub content provider for your app, extend the class\n[ContentProvider](/reference/android/content/ContentProvider) and stub out its required methods. The following\nsnippet shows you how to create the stub provider: \n\n### Kotlin\n\n```kotlin\n/*\n * Define an implementation of ContentProvider that stubs out\n * all methods\n */\nclass StubProvider : ContentProvider() {\n /*\n * Always return true, indicating that the\n * provider loaded correctly.\n */\n override fun onCreate(): Boolean = true\n\n /*\n * Return no type for MIME type\n */\n override fun getType(uri: Uri): String? = null\n\n /*\n * query() always returns no results\n *\n */\n override fun query(\n uri: Uri,\n projection: Array\u003cString\u003e,\n selection: String,\n selectionArgs: Array\u003cString\u003e,\n sortOrder: String\n ): Cursor? = null\n\n /*\n * insert() always returns null (no URI)\n */\n override fun insert(uri: Uri, values: ContentValues): Uri? = null\n\n /*\n * delete() always returns \"no rows affected\" (0)\n */\n override fun delete(uri: Uri, selection: String, selectionArgs: Array\u003cString\u003e): Int = 0\n\n /*\n * update() always returns \"no rows affected\" (0)\n */\n override fun update(\n uri: Uri,\n values: ContentValues,\n selection: String,\n selectionArgs: Array\u003cString\u003e\n ): Int = 0\n}\n```\n\n### Java\n\n```java\n/*\n * Define an implementation of ContentProvider that stubs out\n * all methods\n */\npublic class StubProvider extends ContentProvider {\n /*\n * Always return true, indicating that the\n * provider loaded correctly.\n */\n @Override\n public boolean onCreate() {\n return true;\n }\n /*\n * Return no type for MIME type\n */\n @Override\n public String getType(Uri uri) {\n return null;\n }\n /*\n * query() always returns no results\n *\n */\n @Override\n public Cursor query(\n Uri uri,\n String[] projection,\n String selection,\n String[] selectionArgs,\n String sortOrder) {\n return null;\n }\n /*\n * insert() always returns null (no URI)\n */\n @Override\n public Uri insert(Uri uri, ContentValues values) {\n return null;\n }\n /*\n * delete() always returns \"no rows affected\" (0)\n */\n @Override\n public int delete(Uri uri, String selection, String[] selectionArgs) {\n return 0;\n }\n /*\n * update() always returns \"no rows affected\" (0)\n */\n public int update(\n Uri uri,\n ContentValues values,\n String selection,\n String[] selectionArgs) {\n return 0;\n }\n}\n```\n\nDeclare the provider in the manifest\n------------------------------------\n\n\nThe sync adapter framework verifies that your app has a content provider by checking that your\napp has declared a provider in its app manifest. To declare the stub provider in the\nmanifest, add a [\u003cprovider\u003e](/guide/topics/manifest/provider-element) element with the following attributes:\n\n\n`android:name=\"com.example.android.datasync.provider.StubProvider\"`\n:\n Specifies the fully-qualified name of the class that implements the stub content provider.\n\n\n`android:authorities=\"com.example.android.datasync.provider\"`\n:\n A URI authority that identifies the stub content provider. Make this value your app's\n package name with the string \".provider\" appended to it. Even though you're declaring your\n stub provider to the system, nothing tries to access the provider itself.\n\n\n`android:exported=\"false\"`\n:\n Determines whether other apps can access the content provider. For your stub content\n provider, set the value to `false`, since there's no need to allow other apps to see\n the provider. This value doesn't affect the interaction between the sync adapter framework\n and the content provider.\n\n\n`android:syncable=\"true\"`\n:\n Sets a flag that indicates that the provider is syncable. If you set this flag to\n `true`, you don't have to call [setIsSyncable()](/reference/android/content/ContentResolver#setIsSyncable(android.accounts.Account, java.lang.String, int)) in your code. The flag allows the sync adapter framework to make data\n transfers with the content provider, but transfers only occur if you do them explicitly.\n\n\nThe following snippet shows you how to add the\n[\u003cprovider\u003e](/guide/topics/manifest/provider-element) element to the app manifest: \n\n```xml\n\u003cmanifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"com.example.android.network.sync.BasicSyncAdapter\"\n android:versionCode=\"1\"\n android:versionName=\"1.0\" \u003e\n \u003capplication\n android:allowBackup=\"true\"\n android:icon=\"@drawable/ic_launcher\"\n android:label=\"@string/app_name\"\n android:theme=\"@style/AppTheme\" \u003e\n ...\n \u003cprovider\n android:name=\"com.example.android.datasync.provider.StubProvider\"\n android:authorities=\"com.example.android.datasync.provider\"\n android:exported=\"false\"\n android:syncable=\"true\"/\u003e\n ...\n \u003c/application\u003e\n\u003c/manifest\u003e\n```\n\n\nNow that you have created the dependencies required by the sync adapter framework, you can\ncreate the component that encapsulates your data transfer code. This component is called a\nsync adapter. The next lesson shows you how to add this component to your app."]]