Java 未向批注处理器提供文件室-架构导出目录,因此无法导出架构
我正在使用Android数据库组件室 我已经配置了所有内容,但当我编译时,Android Studio给了我以下警告: 架构导出目录未提供给批注处理器,因此 我们无法导出架构。你可以提供Java 未向批注处理器提供文件室-架构导出目录,因此无法导出架构,java,android,database,android-room,Java,Android,Database,Android Room,我正在使用Android数据库组件室 我已经配置了所有内容,但当我编译时,Android Studio给了我以下警告: 架构导出目录未提供给批注处理器,因此 我们无法导出架构。你可以提供 room.schemaLocation注释处理器参数或集合 exportSchema为false 据我所知,它是DB文件的位置 它如何影响我的应用程序?这里的最佳实践是什么?我是否应该在应用程序模块的build.gradle文件中使用默认位置(false值)?将其添加到defaultConfig部分(在andr
room.schemaLocation
注释处理器参数或集合
exportSchema为false
据我所知,它是DB文件的位置
它如何影响我的应用程序?这里的最佳实践是什么?我是否应该在应用程序模块的
build.gradle
文件中使用默认位置(false
值)?将其添加到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)
}
// ...
根据:
您可以设置注释处理器参数(room.schemaLocation)来告诉room将架构导出到文件夹中。尽管它不是强制性的,但在代码库中有版本历史记录是一种很好的做法,您应该将该文件提交到您的版本控制系统中(但不要随应用程序一起提供!)
因此,如果您不需要检查模式,并且希望消除警告,只需将exportSchema=false
添加到RoomDatabase
,如下所示
@Database(entities = { YourEntity.class }, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
//...
}
如果您遵循下面的@mikejonesguy,您将遵循文档中提到的良好实践:)。
基本上,您将在./app/schemas/
文件夹中获得一个.json
文件。
它看起来像这样:
{
"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\")"
]
}
}
如果我的理解是正确的,那么每次数据库版本更新都会得到这样一个文件,这样您就可以轻松地跟踪数据库的历史记录。Kotlin?我们开始:
android {
// ... (compileSdkVersion, buildToolsVersion, etc)
defaultConfig {
// ... (applicationId, miSdkVersion, etc)
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas")
}
}
}
buildTypes {
// ... (buildTypes, compileOptions, etc)
}
}
//...
不要忘记插件:
应用插件:“kotlin kapt”
有关kotlin annotation processor的更多信息,请访问:
@mikejonesguy非常完美,如果您计划进行测试室迁移(推荐),请将架构位置添加到源集
在build.gradle文件中,指定一个文件夹来放置这些文件
生成的模式JSON文件。当您更新模式时,您将
有几个JSON文件,每个版本一个。确保你承诺
每个生成的文件都要提交给源代码管理。下次你增加
再次输入您的版本号,Room将能够使用JSON文件
测试
- 弗洛里娜·蒙特内斯库()
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]在扩展RoomDatabase的文件中,将行更改为: 或 (因为默认值始终为true) 步骤[2]在build.gradle(项目:??)文件中,在defaultConfig{}中(在android{}大节中),添加javaCompileOptions{}节,如下所示: $projectDir:是一个变量名,不能更改。它将获得您自己的项目目录 模式:是一个字符串,您可以将其更改为任何您喜欢的格式。例如:
“$projectDir/MyOwnSchemas.toString()
我使用.kts
Gradle文件(Kotlin Gradle DSL)和Kotlin kapt
插件,但当我使用Ivanov Maksim的答案时,仍然会出现脚本编译错误
Unresolved reference: kapt
对我来说,这是唯一有效的方法:
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = mapOf("room.schemaLocation" to "$projectDir/schemas")
}
}
}
}
可能您没有将您的room类添加到child
RoomDatabase
数据库中的child类(entities={your_classes})如果您像我一样最近将某些类移动到了不同的包等。你可以使用android导航。确保将argType更改为与新包地址匹配。
发件人:
致:
如果有人想知道,当使用kaptShould时,这种精确的方法也适用于Kotlin。我们应该忽略通过此操作在
app/schemas
目录中生成的json文件。我听说我们应该把模式放在一个目录中,这个目录不包括在apk
中。我们如何才能做到这一点?@ravi生成的架构文件应存储在版本控制中,因为文件室使用它来检测更改,并帮助确保数据库更改是否会更新数据库版本并创建迁移计划此配置是否会影响发布版本?我的意思是,当我将项目导出到发布应用程序时,请使用argument+=
,这样它就不会像Hilt一样干扰您的DI库。(有关更多信息,请参阅此答案)它真正的意思是“不随应用程序一起提供”吗?它将包含在APK中?如果遵循“不随应用程序一起提供”,我应该在生成APK之前删除JSON文件吗?“不随应用程序提供”意味着“不要将schemaLocation设置为类似“app/res/raw”。将schemaLocation设置为APK中不包括的目录。@galcyurio$projectDir/schemas是APK之外的目录,对吗?我已经探索了生成的APK,但我没有在那里看到它。尽管我看到了/res(它代表app/src/main/res),例如。@glucao我研究了APK(还有app包),但没有找到它。所以我相信我们是安全的。在步骤[2]中,你确定这是build.gradle(项目:??)
而不是build.gradle(应用:??)
?对我来说也没有任何效果。我正在使用Kotlin。这个答案是如何工作的?arguments是一个可变映射,val arguments:MutableMap
并在您尝试分配任何内容时给出编译错误,并且使用arguments[“room.schemaLocation”]=“$projectDir/schemas”
添加对我不起作用。其他答案也不起作用。我得到了一个>没有签名的方法:build\u xyz。android()适用于参数类型:(build\u xyz$\u run\u closure1)值:[b
android{
defaultConfig{
//javaComplieOptions SECTION
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation":"$projectDir/schemas".toString()]
}
}
//Other SECTION
...
}
}
Unresolved reference: kapt
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = mapOf("room.schemaLocation" to "$projectDir/schemas")
}
}
}
}
app:argType="com.example.app.old.Item"
app:argType="com.example.app.new.Item"