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

新手上路,请多包涵

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

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

模式导出目录未提供给注释处理器,因此我们无法导出模式。您可以提供 room.schemaLocation 注释处理器参数或将 exportSchema 设置为 false。

据我了解,这是数据库文件所在的位置

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

原文由 Misha Akopov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 440
2 个回答

根据 文档

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

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

原文由 DoruChidean 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

}

// ...

原文由 mikejonesguy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题