Room -模式导出目录没有提供给注释处理器,因此我们不能导出模式

我正在使用Android数据库组件室

我已经配置了一切,但当我编译时,Android Studio给我这个警告:

架构导出目录没有提供给注释处理器 我们不能导出模式。你可以提供 room.schemaLocation注释处理器参数OR集

. exportSchema to false. /p> . exportSchema to false. /p> . exportSchema

根据我的理解,这是DB文件将被定位的位置

它如何影响我的应用程序?这里的最佳实践是什么?我是否应该使用默认位置(false值)?

169071 次浏览

在你的app模块的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)


}


// ...

根据文档:

您可以设置注释处理器参数(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\")"
]
}
}

如果我的理解是正确的,您将在每次数据库版本更新时获得这样一个文件,这样您就可以轻松地跟踪数据库的历史。

芬兰湾的科特林?开始吧:

android {


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


defaultConfig {


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


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


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


//...

不要忘记插件:

apply plugin: 'kotlin-kapt'

更多关于kotlin注释处理器的信息,请访问: 芬兰湾的科特林医生 < / p >

@mikejonesguy 回答是完美的,以防万一你计划测试房间迁移(推荐),将模式位置添加到源集。

在你的构建。Gradle文件你指定一个文件夹来放置这些 生成模式JSON文件。当您更新您的模式时,您将结束 有几个JSON文件,每个版本一个。一定要承诺 每个生成的文件都交给源代码控制。下次你增加的时候 您的版本号再次,房间将能够使用JSON文件 测试。< / p >

  • 弗洛琳娜·蒙涅斯库()

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]在扩展RoomDatabase的文件中,更改行为:

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

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

(因为默认值总是true)

在build.gradle(project:????)文件中,在defaultConfig {}中(在android {}大节中),添加javaCompileOptions {}节,它将像这样:

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

美元管理扫描:是一个变量名,你不能改变它。它会得到你自己的项目目录

模式:是一个字符串,你可以把它改为任何你喜欢的。例如: "$projectDir/MyOwnSchemas".toString() < / p >

我使用.kts Gradle文件(Kotlin Gradle DSL)和kotlin-kapt插件,但当我使用Ivanov Maksim的答案时,我仍然得到一个脚本编译错误。

Unresolved reference: kapt

对我来说,这是唯一有效的方法:

android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = mapOf("room.schemaLocation" to "$projectDir/schemas")
}
}
}
}

可能你没有将你的room类添加到@Database(entities = {your_classes})中的子类RoomDatabase

如果你像我一样最近移动某些类到不同的包等。你使用android导航。确保将argType更改为与您的新包地址匹配。 来自:< / p >

app:argType="com.example.app.old.Item"

:

app:argType="com.example.app.new.Item"

芬兰湾的科特林方式根据官方文件:

android {
...
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments += mapOf(
"room.schemaLocation" to "$projectDir/schemas",
"room.incremental" to "true",
"room.expandProjection" to "true"
)
}
}
}
}

Kotlin KSP:

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

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