Room - Schema导出目录未提供给注释处理器,因此我们无法导出架构

时间:2017-06-02 06:25:38

标签: java android database android-room

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

我已经配置了所有内容,但是当我编译时,Android Studio会给我这个警告:

  

模式导出目录未提供给注释处理器   我们无法导出架构。你可以提供   room.schemaLocation注释处理器参数或集   exportSchema为false。

据我所知,这是DB文件所在的位置

它如何影响我的应用?这里的最佳做法是什么?我应该使用默认位置(false值)吗?

8 个答案:

答案 0 :(得分:280)

在您的应用模块的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)

}

// ...

答案 1 :(得分:279)

根据docs

  

您可以设置注释处理器参数(room.schemaLocation)以告知Room将架构导出到文件夹中。即使它不是强制性的,最好在您的代码库中包含版本历史记录,并且您应该将该文件提交到您的版本控制系统中(但不要将其与您的应用程序一起发送!)。

因此,如果您不需要检查架构并希望摆脱警告,只需将exportSchema = false添加到RoomDatabase,如下所示。

@Database(entities = { YourEntity.class }, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
   //...
}

如果您关注下面的@mikejonesguy answer,您将遵循文档中提到的良好做法:)。 基本上,您将在.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 :(得分:122)

科特林?我们走了:

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

答案 3 :(得分:5)

@mikejonesguy answer很完美,以防万一,您打算测试房间迁移(推荐),请将架构位置添加到源集中。

  

在build.gradle文件中,指定一个文件夹来放置这些文件   生成的模式JSON文件。当您更新架构时,最终   带有几个JSON文件,每个版本一个。确保您提交   每个生成的文件都交给源代码管理。下次增加   再次输入您的版本号,Room可以将JSON文件用于   测试。

     
      
  • Florina Muntenescu(source
  •   

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())
    }

    // [...]
}

答案 4 :(得分:5)

以上答案正确。这个版本很容易遵循:

因为“未将模式导出目录提供给注释处理器”,所以我们需要提供用于模式导出的目录:

  

步骤[1]在扩展RoomDatabase的文件中,将行更改为:

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

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

(因为默认值始终为true)

  

步骤[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 :(得分:2)

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

Unresolved reference: kapt

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

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

答案 6 :(得分:0)

可能您没有将房间课程添加到RoomDatabase的孩子@Database(entities = {your_classes})子课程中

答案 7 :(得分:0)

如果像我一样,您最近将某些类移至其他包等。并且您使用android导航。确保将argType更改为与新的程序包地址匹配。 来自:

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

收件人:

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