Комната - каталог экспорта схемы не предоставляется процессору аннотации, поэтому мы не можем экспортировать схему
Я использую компонентную базу данных Android
Я все настроил, но при компиляции Android Studio выдает мне следующее предупреждение:
Каталог экспорта схемы не предоставляется обработчику аннотаций, поэтому мы не можем экспортировать схему. Вы можете предоставить room.schemaLocation
процессора аннотаций room.schemaLocation
ИЛИ установить для exportSchema значение false.
Как я понимаю, это место, где будет расположен файл БД
Как это может повлиять на мое приложение? Какова лучшая практика здесь? Должен ли я использовать местоположение по умолчанию (false
значение)?
Ответы
Ответ 1
Согласно документам:
Вы можете установить аргумент процессора аннотаций (room.schemaLocation), чтобы сообщить Room об экспорте схемы в папку. Несмотря на то, что это не является обязательным, рекомендуется иметь историю версий в вашей кодовой базе, и вы должны зафиксировать этот файл в вашей системе контроля версий (но не поставляйте его вместе с приложением!).
Поэтому, если вам не нужно проверять схему и вы хотите избавиться от предупреждения, просто добавьте exportSchema = false
в вашу RoomDatabase
следующим образом.
@Database(entities = { YourEntity.class }, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
//...
}
Если вы будете следовать ответу @mikejonesguy ниже, вы будете следовать рекомендациям, упомянутым в документации :). В основном вы получите файл .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\")"
]
}
}
Если мое понимание верно, вы будете получать такой файл при каждом обновлении версии базы данных, чтобы вы могли легко следить за историей вашей базы данных.
Ответ 2
В файле 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)
}
// ...
Ответ 3
Котлин? Вот так:
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 docs
Ответ 4
Выше ответы верны. Эту версию легко понять:
Поскольку "Каталог экспорта схемы не предоставляется процессору аннотаций", поэтому нам нужно предоставить каталог для экспорта схемы:
Шаг [1] В вашем файле, который расширяет RoomDatabase, измените строку на:
'@Database(entities = ???.class,version = 1, exportSchema = true)'
Или же
'@Database(entities = ???.class,version = 1)'
(потому что значение по умолчанию всегда верно)
Шаг [2] В вашем файле build.gradle(project:????) внутри defaultConfig {} (который находится внутри большого раздела android {}) добавьте раздел javaCompileOptions {}, это будет выглядеть так:
android{
defaultConfig{
//javaComplieOptions SECTION
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation":"$projectDir/schemas".toString()]
}
}
//Other SECTION
...
}
}
$ projectDir: это имя переменной, вы не можете его изменить. он получит ваш собственный каталог проектов
схемы: это строка, вы можете изменить ее на любую, какую захотите. Например: "$projectDir/MyOwnSchemas".toString()
Ответ 5
@mikejonesguy ответ идеально подходит, на случай, если вы планируете тестировать переносы комнат (рекомендуется), добавьте расположение схемы в исходные наборы.
В вашем файле 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())
}
// [...]
}
Ответ 6
Я использую файлы .kts
Gradle (Kotlin Gradle DSL) и плагин kotlin-kapt
, но все равно получаю ошибку компиляции скрипта, когда использую ответ иванова Максима.
Unresolved reference: kapt
Для меня это было единственное, что сработало:
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = mapOf("room.schemaLocation" to "$projectDir/schemas")
}
}
}
}
Ответ 7
Возможно, вы не добавили свой класс комнаты в детский класс RoomDatabase
в @Database(entities = {your_classes})