Android 架构组件之Room数据库 处理Schema export Error

在使用 Android Room数据库的时候,虽然项目可以运行起来。

但是,却报以下error:

Error:(22, 17) 警告: Schema export directory is not provided to the annotation processor so we cannot export the schema. 

You can either provide `room.schemaLocation` annotation processor argument OR set exportSchema to false.

实际上,上面已经提示了开发者应该怎么处理,给出了两种方案。


解决方式一

给RoomDatabase设置exportSchema注解为false。

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

   ...

}

解决方案二

在项目中gradle中通过 annotationProcessorOptions 注解,为room.schemaLocation指定schemas的子文件夹。

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"
    defaultConfig {
        applicationId "com.xingen.architecturecomponents"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        //指定room.schemaLocation生成的文件路径
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    }

}

当执行项目后,在Android Studio 的Project视图下,查看项目,会发现Module生成了一个schemas的文件夹,如下图所示:

这里写图片描述

其中,会生成版本1的Json文件,这里可以查看Room数据库的配置情况:

{
  "formatVersion": 1,
  "database": {
    "version": 1,
    "identityHash": "8240057b6178b803a0bf9915edf969ef",
    "entities": [
      {
        "tableName": "movies",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `year` TEXT, `title` TEXT, `image` TEXT)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "year",
            "columnName": "year",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "title",
            "columnName": "title",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "image",
            "columnName": "image",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "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, \"8240057b6178b803a0bf9915edf969ef\")"
    ]
  }
}
以上项目案例的连接https://github.com/13767004362/ArchitectureComponentsDemo

资源参考

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android中的Room是一个用于SQLite数据库访问的持久化库。它提供了一个抽象层,允许开发者使用Java对象来代表数据库表,并且可以通过简单的查询语言进行数据的读取和写入。 在使用Room时,我们有时会遇到`exportschema`这个问题。`exportschema`是一个编译时的选项,用于指定是否导出数据库Schema信息。 Schema信息包括了数据库表的结构、索引、触发器等定义,它可以帮助我们在开发和调试过程中更好地了解数据库的结构。但是在发布应用时,我们通常希望保密数据库的结构,以增加应用的安全性和防止数据库被恶意使用。 在Room中,默认情况下是开启了`exportschema`的,编译时会自动导出Schema信息。这样可以方便我们在开发和调试时查看数据库的结构。 如果我们不希望导出Schema信息,可以在Room的Database类上添加`@Database`注解,并将`exportSchema`属性设置为false,即`exportSchema = false`。这样,在编译时就不会导出数据库Schema信息。 使用示例如下: ```java @Database(entities = {User.class}, version = 1, exportSchema = false) public abstract class AppDatabase extends RoomDatabase { // ... } ``` 这样,当我们发布应用时,就可以确保数据库Schema信息不会被暴露出去,增加了应用的安全性。但需要注意的是,如果我们需要使用Room数据库迁移功能,即在更新应用版本时保留现有数据,那么在每次更新数据库版本时,需要开启`exportschema`选项,以便Room能够根据Schema信息进行自动迁移处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值