546 votes

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 Composant de Base de données de la Salle de

J'ai tout configuré, mais quand je compile, Android Studio me donne cet avertissement:

Schéma de répertoire d'exportation n'est pas fourni à l'annotation processeur nous ne pouvons pas exporter le schéma. Vous pouvez soit fournir room.schemaLocation processeur d'annotation d'un argument OU d'ensemble exportSchema à false.

Ce que je comprends, c'est l'emplacement où le fichier DB sera situé

Comment peut-il affecter mon application ? Quelles sont les meilleures pratiques ici ? Dois-je utiliser l'emplacement par défaut (false de la valeur) ?

590voto

mikejonesguy Points 1680

Dans le fichier build.gradle de votre module d'application, ajoutez-le à 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)

}

// ...
 

545voto

DoruChidean Points 3188

Selon les docs:

Vous pouvez définir processeur d'annotation argument (la chambre.schemaLocation) pour dire à la Chambre à exporter le schéma dans un dossier. Même s'il n'est pas obligatoire, c'est une bonne pratique d'avoir la version de l'histoire dans votre base de code et vous vous engager à ce fichier dans votre système de contrôle de version (mais ne pas l'expédier 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, il suffit d'ajouter exportSchema = false votre RoomDatabase, comme suit.

@Database(entities = { YourEntity.class }, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
   //...
}

Si vous suivez @mikejonesguy réponse ci-dessous, vous suivez les bonnes pratiques mentionnées dans les docs :). Fondamentalement, vous obtiendrez un .json le fichier dans votre ../app/schemas/le dossier. Et il ressemble à quelque chose comme ceci:

{
  "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 obtenez un fichier avec toutes les version de base de données mise à jour, de sorte que vous pouvez facilement suivre l'histoire de votre base de données.

339voto

Ivanov Maksim Points 1303

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: docs Kotlin

18voto

LunaRivolxoxo Points 26

Réponses ci-dessus sont correctes. Cette version est facile à suivre:

Parce que "le Schéma de répertoire d'exportation n'est pas fourni à l'annotation du processeur", nous avons Donc besoin de fournir le répertoire pour le schéma d'exportation:

L'étape [1] Dans votre fichier qui s'étend de la RoomDatabase, modifiez la ligne:

`@Database(entities = ???.class,version = 1, exportSchema = true)`

Ou

`@Database(entities = ???.class,version = 1)` 

(car la valeur par défaut est toujours vrai)

L'étape [2] Dans votre construction.gradle(du projet:????) fichier, à l'intérieur de la defaultconfig.ini.php{ } (qui est à l'intérieur android{ } grande section), ajouter le javaCompileOptions{ } de la section, il 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 permettra à votre propre répertoire du projet

schémas:est une chaîne de caractères, vous pouvez le changer à tout que vous aimez. Par exemple: "$projectDir/MyOwnSchemas".toString()

16voto

chebaby Points 1102

@mikejonesguy réponse est parfait, juste au cas où vous plan pour salle de contrôle des migrations (recommandé), ajouter le schéma de localisation de la source fixe.

Dans votre construction.gradle fichier que vous spécifiez un dossier à la place de ces schéma généré des fichiers JSON. Si vous mettez à jour votre schéma, vous finirez par avec plusieurs fichiers JSON, un pour chaque version. Assurez-vous de vous engager chaque fichier généré à la source de contrôle. La prochaine fois que vous augmentez votre numéro de version de nouveau, la Salle sera en mesure d'utiliser le fichier JSON pour les tests.

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

    // [...]
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X