J'utilise Android Database Component Room
J'ai tout configuré, mais lors de la compilation, Android Studio me donne cet avertissement:
Le répertoire d'exportation de schéma n'est pas fourni au processeur d'annotation, donc nous ne pouvons pas exporter le schéma. Vous pouvez soit fournir
room.schemaLocation
argument du processeur d'annotation OR défini exportSchema à false.
Si je comprends bien, c’est l’emplacement du fichier de base de données.
Comment cela peut-il affecter mon application? Quelle est la meilleure pratique ici? Devrais-je utiliser l'emplacement par défaut (valeur false
)?
Selon les docs :
Vous pouvez définir un argument de processeur d'annotation (room.schemaLocation) pour indiquer à Room d'exporter le schéma dans un dossier. Même si cela n’est pas obligatoire, il est recommandé d’avoir un historique des versions dans votre base de code et vous devez enregistrer ce fichier dans votre système de contrôle de version (mais ne l’envoyez pas avec votre application!).
Donc, si vous n'avez pas besoin de vérifier le schéma et que vous voulez vous débarrasser de l'avertissement, ajoutez simplement exportSchema = false
à votre RoomDatabase
, comme suit.
@Database(entities = { YourEntity.class }, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
//...
}
Si vous suivez @mikejonesguy answer ci-dessous, vous suivrez la bonne pratique mentionnée dans la documentation:) . En gros, vous obtiendrez un fichier .json
dans votre dossier ../app/schemas/
.
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "53db508c5248423325bd5393a1c88c03",
"entities": [
{
"tableName": "sms_table",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `message` TEXT, `date` INTEGER, `client_id` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER"
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT"
},
{
"fieldPath": "date",
"columnName": "date",
"affinity": "INTEGER"
},
{
"fieldPath": "clientId",
"columnName": "client_id",
"affinity": "INTEGER"
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": []
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"53db508c5248423325bd5393a1c88c03\")"
]
}
}
Si ma compréhension est correcte, vous obtiendrez un tel fichier avec chaque mise à jour de version de base de données, de sorte que vous puissiez facilement suivre l'historique de votre base de données.
Dans le fichier build.gradle
de votre module d'application, ajoutez ceci à la section defaultConfig
(sous la section Android
). Cela écrira le schéma dans un sous-dossier schemas
de votre dossier de projet.
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
Comme ça:
// ...
Android {
// ... (compileSdkVersion, buildToolsVersion, etc)
defaultConfig {
// ... (applicationId, miSdkVersion, etc)
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
}
// ... (buildTypes, compileOptions, etc)
}
// ...
Kotlin? Et c'est parti:
Android {
// ... (compileSdkVersion, buildToolsVersion, etc)
defaultConfig {
// ... (applicationId, miSdkVersion, etc)
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
}
buildTypes {
// ... (buildTypes, compileOptions, etc)
}
}
//...
N'oubliez pas le plugin:
apply plugin: 'kotlin-kapt'
Pour plus d'informations sur le processeur d'annotation Kotlin, veuillez consulter: Kotlin docs
@mikejonesguy answer est parfait. Si vous envisagez de tester les migrations de salles (recommandé), ajoutez l'emplacement du schéma aux ensembles source.
Dans votre fichier build.gradle, vous spécifiez un dossier dans lequel placer ces fichiers fichiers JSON de schéma générés. Au fur et à mesure que vous mettez à jour votre schéma, vous allez finir par avec plusieurs fichiers JSON, un pour chaque version. Assurez-vous de vous engager chaque fichier généré au contrôle de source. La prochaine fois que vous augmentez votre numéro de version, Room pourra utiliser le fichier JSON pour essai.
- Florina Muntenescu ( source )
build.gradle
Android {
// [...]
defaultConfig {
// [...]
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
}
// add the schema location to the source sets
// used by Room, to test migrations
sourceSets {
androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
}
// [...]
}
Les réponses ci-dessus sont correctes. Cette version est facile à suivre:
Parce que "Le répertoire d'exportation de schéma n'est pas fourni au processeur d'annotation", nous devons donc fournir le répertoire pour l'exportation de schéma:
Étape [1] Dans votre fichier qui étend RoomDatabase, modifiez la ligne en:
`@Database(entities = ???.class,version = 1, exportSchema = true)`
Ou
`@Database(entities = ???.class,version = 1)`
(parce que la valeur par défaut est toujours vraie)
Étape [2] Dans votre fichier build.gradle (project: ????), dans la defaultConfig {} (qui se trouve dans la grande section Android {}), ajoutez le javaCompileOptions {}. section, ce sera comme:
Android{
defaultConfig{
//javaComplieOptions SECTION
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation":"$projectDir/schemas".toString()]
}
}
//Other SECTION
...
}
}
$ projectDir: est un nom de variable, vous ne pouvez pas le changer. il obtiendra votre propre répertoire de projet
schemas: est une chaîne, vous pouvez la changer à votre guise. Par exemple: "$projectDir/MyOwnSchemas".toString()