web-dev-qa-db-fra.com

Room - Le répertoire d'exportation de schéma n'est pas fourni au processeur d'annotation, nous ne pouvons donc pas exporter le schéma

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

207
Misha Akopov

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.

236
DoruChidean

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)

}

// ...
249
mikejonesguy

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

102
Ivanov Maksim

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

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())
    }

    // [...]
}
1
chebaby

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

0
LunaRivolxoxo