it-swarm.com.de

Raum - Schemaexportverzeichnis wird dem Anmerkungsprozessor nicht zur Verfügung gestellt, daher können wir das Schema nicht exportieren

Ich verwende Android Database Component Room

Ich habe alles konfiguriert, aber beim Kompilieren gibt mir Android Studio die folgende Warnung:

Das Schemaexportverzeichnis wird dem Anmerkungsprozessor nicht zur Verfügung gestellt. Wir können das Schema nicht exportieren. Sie können entweder .__ angeben. room.schemaLocation Anmerkungsprozessorargument OR gesetzt exportSchema auf false.

Soweit ich weiß, ist dies der Ort, an dem die DB-Datei gespeichert wird

Wie kann es meine App beeinflussen? Was ist die beste Praxis hier? Soll ich den Standardspeicherort verwenden (false-Wert)?

207
Misha Akopov

Wie in den docs :

Sie können ein Anmerkungsprozessorargument (room.schemaLocation) festlegen, um Room anzuweisen, das Schema in einen Ordner zu exportieren. Auch wenn dies nicht zwingend vorgeschrieben ist, sollten Sie den Versionsverlauf in Ihrer Codebase haben. Sie sollten diese Datei in Ihr Versionskontrollsystem einbinden (aber nicht mit Ihrer App versenden!).

Wenn Sie also das Schema nicht überprüfen müssen und die Warnung entfernen möchten, fügen Sie exportSchema = false wie folgt zu Ihrer RoomDatabase hinzu.

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

Wenn Sie @mikejonesguy answer folgen, befolgen Sie die in den Dokumenten beschriebene bewährte Vorgehensweise:) . Grundsätzlich erhalten Sie eine .json-Datei in Ihrem ../app/schemas/-Ordner . Und es sieht etwa so aus:

{
  "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\")"
    ]
  }
}

Wenn ich Sie richtig verstanden habe, erhalten Sie mit jedem Update der Datenbankversion eine solche Datei, sodass Sie den Verlauf Ihrer Datenbank problemlos verfolgen können.

236
DoruChidean

Fügen Sie dies in der build.gradle-Datei für Ihr App-Modul dem Abschnitt defaultConfig hinzu (im Abschnitt Android). Dadurch wird das Schema in einen schemas-Unterordner Ihres Projektordners geschrieben.

javaCompileOptions {
    annotationProcessorOptions {
        arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
    }
}

So was:

// ...

Android {

    // ... (compileSdkVersion, buildToolsVersion, etc)

    defaultConfig {

        // ... (applicationId, miSdkVersion, etc)

        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    }

    // ... (buildTypes, compileOptions, etc)

}

// ...
249
mikejonesguy

Kotlin? Auf geht's: 

Android {

    // ... (compileSdkVersion, buildToolsVersion, etc)

    defaultConfig {

     // ... (applicationId, miSdkVersion, etc)

        kapt {
            arguments {
                arg("room.schemaLocation", "$projectDir/schemas".toString())
            }
        }
    }

    buildTypes {
    // ... (buildTypes, compileOptions, etc)
    }
}

//...

Vergiss das Plugin nicht: 

apply plugin: 'kotlin-kapt'

Weitere Informationen zu Kotlin Annotation Processor finden Sie unter: Kotlin docs

102
Ivanov Maksim

@mikejonesguy answer ist perfekt. Nur für den Fall, dass Sie Raummigrationen testen möchten (empfohlen), fügen Sie den Quellcode den Schema-Speicherort hinzu.

In Ihrer build.gradle-Datei geben Sie einen Ordner an, um diese .__ zu platzieren. generierte Schema-JSON-Dateien. Wenn Sie Ihr Schema aktualisieren, werden Sie enden mit mehreren JSON-Dateien, eine für jede Version. Stellen Sie sicher, dass Sie begehen jede generierte Datei zur Quellcodeverwaltung. Beim nächsten Mal erhöhen Sie Wenn Sie Ihre Versionsnummer erneut eingeben, kann Room die JSON-Datei für .__ verwenden. testen.

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

Die obigen Antworten sind richtig. Diese Version ist leicht zu folgen:

Da "Schemaexportverzeichnis dem Anmerkungsprozessor nicht zur Verfügung gestellt wird", müssen wir das Verzeichnis für den Schemaexport bereitstellen:

Schritt [1] Ändern Sie in Ihrer Datei, die die RoomDatabase erweitert, die Zeile in:

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

Oder

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

(weil der Standardwert immer true ist)

Schritt [2] Fügen Sie in Ihrer build.gradle-Datei (project: ????) in der defaultConfig {} (die sich in Android {} big befindet) die javaCompileOptions {} hinzu. Abschnitt wird es sein wie:

         Android{
                defaultConfig{
                      //javaComplieOptions SECTION
                      javaCompileOptions {
                            annotationProcessorOptions {
                                     arguments = ["room.schemaLocation":"$projectDir/schemas".toString()]
                            }
                       }
                      //Other SECTION
                      ...
                }
         }

$ projectDir : ist ein Variablenname, Sie können ihn nicht ändern. es wird ein eigenes Projektverzeichnis erhalten

schemas : ist eine Zeichenfolge, die Sie beliebig ändern können. Zum Beispiel: "$projectDir/MyOwnSchemas".toString()

0
LunaRivolxoxo