5

Room - Директория экспорта схемы не указана аннотационному процессору, не удается экспортировать схему

48

Описание проблемы

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

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

Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide room.schemaLocation annotation processor argument OR set exportSchema to false.

Насколько я понимаю, это место, где будет находиться файл схемы базы данных.

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

5 ответ(ов)

5

Для того чтобы сохранить схему вашей базы данных в папку schemas в корневом каталоге проекта, добавьте следующий код в секцию defaultConfig вашего файла build.gradle для модуля приложения (под секцией android):

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

В результате ваш build.gradle может выглядеть следующим образом:

// ...

android {
    
    // ... (compileSdkVersion, buildToolsVersion и др.)

    defaultConfig {

        // ... (applicationId, minSdkVersion и др.)
        
        javaCompileOptions {
            annotationProcessorOptions {
                arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    }
   
    // ... (buildTypes, compileOptions и др.)

}

// ...

Таким образом, расположив указанный код в нужной секции, вы настроите сохранение схемы базы данных, что может быть полезно для отслеживания изменений в структуре вашей базы данных при использовании библиотеки Room.

1

В случае использования Kotlin Symbol Processing (KSP) с Kotlin DSL, настройка параметра room.schemaLocation для указания директории схем может выглядеть следующим образом:

ksp {
    arg("room.schemaLocation", "$projectDir/schemas")
}

Обратите внимание, что здесь используются двойные кавычки вместо одинарных, как и требуется в Kotlin DSL.

0

Вышеуказанные ответы верны. Эта версия проста для понимания:

Проблема заключается в том, что "Каталог экспорта схемы не предоставлен аннотационному процессору". Поэтому нам нужно указать каталог для экспорта схемы:

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

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

Или

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

(поскольку значение по умолчанию всегда true)

Шаг 2: В вашем файле build.gradle (проект: ????), внутри секции defaultConfig (которая находится внутри большой секции android), добавьте секцию javaCompileOptions, это будет выглядеть следующим образом:

android {
    defaultConfig {
        // СЕКЦИЯ javaCompileOptions
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
        // ДРУГАЯ СЕКЦИЯ
        ...
    }
}

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

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

0

Этот код на языке Groovy показывает, как настроить плагин Kotlin Annotation Processing Tool (kapt) в вашем проекте для указания места хранения схем для библиотеки Room.

В данном фрагменте кода используется секция arguments, в которой задается аргумент room.schemaLocation. Он указывает путь к директории, в которой будут храниться сгенерированные схемы базы данных. Переменная $projectDir указывает на корневую директорию вашего проекта, а schemas — это имя подкаталога, в который будут помещены схемы.

Таким образом, при сборке проекта с использованием kapt, он будет генерировать схемы базы данных и сохранять их в директории /schemas вашего проекта. Это может быть полезно для отладки и проверки структуры вашей базы данных в процессе разработки.

Если у вас есть дополнительные вопросы по настройке kapt или Room, не стесняйтесь спрашивать!

0

Судя по вашему описанию, проблема заключается в том, что вы используете .kts файлы Gradle (Kotlin DSL), но получаете ошибку компиляции скрипта, связанную с kapt. Ошибка Unresolved reference: kapt может возникать по нескольким причинам, наиболее вероятные из которых - это неправильная настройка Kotlin KAPT или отсутствие необходимых зависимостей.

Чтобы исправить эту ошибку, убедитесь, что вы правильно применили плагин kotlin-kapt в вашем проекте. Вот пример того, как вы можете это сделать в вашем build.gradle.kts файле:

plugins {
    kotlin("android")
    kotlin("kapt")
}

android {
    // Ваши другие настройки
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = mapOf("room.schemaLocation" to "$projectDir/schemas")
            }
        }
    }
}

Также не забудьте добавить необходимые зависимости для KAPT в секции dependencies:

dependencies {
    implementation("androidx.room:room-runtime:2.x.x")
    kapt("androidx.room:room-compiler:2.x.x")
    // другие зависимости
}

Проверьте, что вы используете правильные версии библиотек и что ваш проект правильно настроен для использования Kotlin KAPT. Если ошибка все еще сохраняется, попробуйте очистить кэш Gradle с помощью команды ./gradlew clean build, чтобы исключить конфликты или временные проблемы.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь