it-roy-ru.com

Комната - каталог экспорта схемы не предоставлен обработчику аннотаций, поэтому мы не можем экспортировать схему

Я использую компонентную базу данных Android

Я все настроил, но при компиляции Android Studio выдает мне следующее предупреждение:

Директория экспорта схемы не предоставлена ​​обработчику аннотаций, поэтому мы не можем экспортировать схему. Вы можете предоставить room.schemaLocation аргумент процессора аннотаций OR установлен exportSchema в false.

Как я понимаю, это место, где будет расположен файл БД

Как это может повлиять на мое приложение? Какова лучшая практика здесь? Должен ли я использовать местоположение по умолчанию (значение false)?

207
Misha Akopov

В соответствии с документы :

Вы можете установить аргумент процессора аннотаций (room.schemaLocation), чтобы сообщить Room об экспорте схемы в папку. Несмотря на то, что это не является обязательным, рекомендуется иметь историю версий в базе кода, и вы должны зафиксировать этот файл в своей системе контроля версий (но не поставляйте его вместе с приложением!).

Поэтому, если вам не нужно проверять схему и вы хотите избавиться от предупреждения, просто добавьте exportSchema = false к вашей RoomDatabase, как показано ниже.

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

Если вы будете следовать @mikejonesguy answer ниже, вы будете следовать рекомендациям, упомянутым в документации:) . В основном вы получите файл .json в своей папке ../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\")"
    ]
  }
}

Если мое понимание верно, вы будете получать такой файл при каждом обновлении версии базы данных, чтобы вы могли легко следить за историей вашей базы данных.

236
DoruChidean

В файле build.gradle для вашего модуля приложения добавьте его в раздел defaultConfig (в разделе Android). Это запишет схему в подпапку schemas папки вашего проекта.

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

Как это:

// ...

Android {

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

    defaultConfig {

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

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

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

}

// ...
249
mikejonesguy

Котлин? Вот так: 

Android {

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

    defaultConfig {

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

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

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

//...

Не забудьте о плагине: 

apply plugin: 'kotlin-kapt'

Для получения дополнительной информации о процессоре аннотаций kotlin, пожалуйста, посетите: Документы Kotlin

102
Ivanov Maksim

@mikejonesguy answer отлично, на всякий случай, если вы планируете протестировать миграцию комнаты (рекомендуется), добавьте расположение схемы в исходные наборы.

В вашем файле build.gradle вы указываете папку для размещения этих сгенерированные файлы JSON схемы. Когда вы обновите свою схему, вы в конечном итоге с несколькими файлами JSON, по одному для каждой версии. Убедитесь, что вы совершаете каждый сгенерированный файл для контроля версий. В следующий раз вы увеличите Ваш номер версии снова, Room сможет использовать файл JSON для тестирование.

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

Выше ответы верны. Эту версию легко понять:

Поскольку «Каталог экспорта схемы не предоставляется процессору аннотаций», поэтому нам нужно предоставить каталог для экспорта схемы:

Шаг [1] В вашем файле, который расширяет RoomDatabase, измените строку на:

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

Или же

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

(потому что значение по умолчанию всегда верно)

Шаг [2] В вашем файле build.gradle (project: ????) внутри defaultConfig {} (который находится внутри Android {} big раздела) добавьте javaCompileOptions {} раздел, это будет похоже на:

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

$ projectDir : это имя переменной, вы не можете его изменить. он получит ваш собственный каталог проектов

схемы : это строка, вы можете изменить ее на любую, какую захотите. Например: "$projectDir/MyOwnSchemas".toString()

0
LunaRivolxoxo