java - primary - room unique android




Room: la directory di esportazione dello schema non viene fornita al processore delle annotazioni, quindi non รจ possibile esportare lo schema (4)

Sto usando Android Component Room Database

Ho configurato tutto, ma quando compilo, Android Studio mi dà questo avviso:

La directory di esportazione dello schema non viene fornita al processore delle annotazioni, quindi non è possibile esportare lo schema. Puoi fornire l'argomento del processore di annotazione room.schemaLocation o impostare exportSchema su false.

A quanto ho capito, è la posizione in cui si troverà il file DB

In che modo può influire sulla mia app? Qual è la migliore pratica qui? Devo usare la posizione predefinita (valore false )?


Kotlin? Eccoci qui:

android {

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

    defaultConfig {

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

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

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

//...

Non dimenticare il plug-in:

apply plugin: 'kotlin-kapt'

Per ulteriori informazioni sul processore di annotazioni di Kotlin , visitare: Documenti di Kotlin


La answer @mikejonesguy è perfetta, nel caso in cui si preveda di testare le migrazioni della sala (consigliato), aggiungere la posizione dello schema ai set di sorgenti.

Nel file build.gradle si specifica una cartella per posizionare questi file JSON dello schema generati. Man mano che aggiorni lo schema, finirai con diversi file JSON, uno per ogni versione. Assicurati di eseguire il commit di ogni file generato nel controllo del codice sorgente. La prossima volta che aumenterai di nuovo il numero di versione, Room sarà in grado di utilizzare il file JSON per i test.

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

    // [...]
}

Nel file build.gradle per il modulo dell'app, aggiungilo alla sezione defaultConfig (sotto la sezione android ). Questo scriverà lo schema in una sottocartella di schemas cartella del progetto.

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

Come questo:

// ...

android {

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

    defaultConfig {

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

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

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

}

// ...

Secondo i docs :

Puoi impostare l'argomento del processore di annotazione (room.schemaLocation) per dire a Room di esportare lo schema in una cartella. Anche se non è obbligatorio, è buona norma avere la cronologia delle versioni nella tua base di codice e dovresti eseguire il commit di quel file nel tuo sistema di controllo della versione (ma non spedirlo con la tua app!).

Pertanto, se non è necessario controllare lo schema e si desidera eliminare l'avviso, aggiungere exportSchema = false al RoomDatabase , come indicato di seguito.

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

Se segui la answer @mikejonesguy di seguito, seguirai le buone pratiche menzionate nei documenti :). Fondamentalmente otterrai un file .json nella tua cartella ../app/schemas/ . E sembra qualcosa del genere:

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

Se la mia comprensione è corretta, otterrai tale file con ogni aggiornamento della versione del database, in modo da poter seguire facilmente la cronologia del tuo db.





android-room