Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 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})