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

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

架构导出目录没有提供给注释处理器,因此 我们不能导出模式。你可以提供 房间。schemaLocation注释处理器参数OR集 exportSchema为false。

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

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


当前回答

根据文档:

您可以设置注释处理器参数(Room . schemalocation)来告诉Room将模式导出到一个文件夹中。即使它不是强制性的,在你的代码库中有版本历史记录是一个很好的实践,你应该将该文件提交到你的版本控制系统中(但不要随应用一起发布!)

因此,如果您不需要检查模式,并且希望消除警告,只需向RoomDatabase添加exportSchema = false,如下所示。

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

如果你遵循下面的@mikejonesguy回答,你将遵循文档中提到的良好实践:)。 基本上你会得到一个.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\")"
    ]
  }
}

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

其他回答

在构建中。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将模式导出到一个文件夹中。即使它不是强制性的,在你的代码库中有版本历史记录是一个很好的实践,你应该将该文件提交到你的版本控制系统中(但不要随应用一起发布!)

因此,如果您不需要检查模式,并且希望消除警告,只需向RoomDatabase添加exportSchema = false,如下所示。

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

如果你遵循下面的@mikejonesguy回答,你将遵循文档中提到的良好实践:)。 基本上你会得到一个.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\")"
    ]
  }
}

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

卡普特 { 参数 { arg(“room.schemaLocation”, “$projectDir/schemas”) } }

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

android {

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

    defaultConfig {

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

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

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

//...

不要忘记插件:

应用插件:“科特林-卡皮特”

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

致Kotlin KSP:

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