Mis*_*pov 310 java database android android-room
我正在使用Android数据库组件室
我已经配置了所有内容,但是当我编译时,Android Studio会给我这个警告:
模式导出目录未提供给注释处理器,因此我们无法导出模式.您可以提供
room.schemaLocation
注释处理器参数或将exportSchema设置为false.
据我所知,它是DB文件所在的位置
它怎么会影响我的应用程序?这里的最佳做法是什么?我应该使用默认位置(false
值)吗?
Dor*_*ean 345
根据文档:
您可以设置注释处理器参数(room.schemaLocation)以告知Room将架构导出到文件夹中.即使它不是强制性的,最好在代码库中包含版本历史记录,然后将该文件提交到版本控制系统中(但不要随应用程序一起提供!).
因此,如果您不需要检查架构并且想要删除警告,只需添加exportSchema = false
到您的RoomDatabase
,如下所示.
@Database(entities = { YourEntity.class }, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
//...
}
Run Code Online (Sandbox Code Playgroud)
如果您按照下面的@mikejonesguy 回答,您将遵循文档中提到的良好做法:).基本上你会.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\")"
]
}
}
Run Code Online (Sandbox Code Playgroud)
如果我的理解是正确的,您将获得每个数据库版本更新的这样一个文件,以便您可以轻松地跟踪数据库的历史记录.
mik*_*guy 335
在build.gradle
您的应用模块的文件中,将其添加到该defaultConfig
部分(在该android
部分下).这会将架构写出到schemas
项目文件夹的子文件夹中.
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
Run Code Online (Sandbox Code Playgroud)
像这样:
// ...
android {
// ... (compileSdkVersion, buildToolsVersion, etc)
defaultConfig {
// ... (applicationId, miSdkVersion, etc)
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
}
// ... (buildTypes, compileOptions, etc)
}
// ...
Run Code Online (Sandbox Code Playgroud)
Iva*_*sim 151
科特林?开始了:
android {
// ... (compileSdkVersion, buildToolsVersion, etc)
defaultConfig {
// ... (applicationId, miSdkVersion, etc)
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
}
buildTypes {
// ... (buildTypes, compileOptions, etc)
}
}
//...
Run Code Online (Sandbox Code Playgroud)
不要忘记插件:
apply plugin: 'kotlin-kapt'
有关kotlin注释处理器的更多信息,请访问: Kotlin docs
Eyj*_*afl 80
对于 Kotlin KSP:
ksp {
arg('room.schemaLocation', "$projectDir/schemas")
}
Run Code Online (Sandbox Code Playgroud)
(这是 Groovy DSL,在 Kotlin DSL 中使用双引号)
小智 10
以上答案是正确的。这个版本很容易理解:
因为“未将模式导出目录提供给注释处理器”,所以我们需要提供用于模式导出的目录:
步骤[1]在扩展RoomDatabase的文件中,将行更改为:
`@Database(entities = ???.class,version = 1, exportSchema = true)`
Run Code Online (Sandbox Code Playgroud)
要么
`@Database(entities = ???.class,version = 1)`
Run Code Online (Sandbox Code Playgroud)
(因为默认值始终为true)
步骤[2]在您的build.gradle(project:????)文件中,在defaultConfig {}(位于android {}大节内部)中,添加javaCompileOptions {}节,如下所示:
android{
defaultConfig{
//javaComplieOptions SECTION
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation":"$projectDir/schemas".toString()]
}
}
//Other SECTION
...
}
}
Run Code Online (Sandbox Code Playgroud)
$ projectDir:是变量名,您不能更改它。它将获得您自己的项目目录
schemas:是一个字符串,您可以将其更改为任意字符串。例如:
"$projectDir/MyOwnSchemas".toString()
@mikejonesguy的答案是完美的,以防万一,您打算测试房间迁移(推荐),请将架构位置添加到源集中。
在build.gradle文件中,指定一个文件夹来放置这些生成的模式JSON文件。在更新架构时,最终会得到几个JSON文件,每个版本一个。确保将每个生成的文件提交到源代码管理。下次再次增加版本号时,Room将能够使用JSON文件进行测试。
- Florina Muntenescu(来源)
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())
}
// [...]
}
Run Code Online (Sandbox Code Playgroud)
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas")
}
}
Run Code Online (Sandbox Code Playgroud)
我使用.kts
Gradle 文件(Kotlin Gradle DSL)和kotlin-kapt
插件,但当我使用 Ivanov Maksim 的答案时,我仍然收到脚本编译错误。
Unresolved reference: kapt
Run Code Online (Sandbox Code Playgroud)
对我来说,这是唯一有效的方法:
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = mapOf("room.schemaLocation" to "$projectDir/schemas")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
按照官方文档的Kotlin方式:
android {
...
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments += mapOf(
"room.schemaLocation" to "$projectDir/schemas",
"room.incremental" to "true",
"room.expandProjection" to "true"
)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
只是发布对我有用的东西Kotlin DSL
defaultConfig {
applicationId = ""
minSdk = 26
targetSdk = 33
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
//add this in the build.gradle.kts(app) file
javaCompileOptions {
annotationProcessorOptions {
arguments["room.schemaLocation"] =
"$projectDir/schemas"
}
}
}
Run Code Online (Sandbox Code Playgroud)
为此,您还需要设置exportSchema
为true
@Database(entities = [Entity::class], version = 1, exportSchema = true)
@TypeConverters(Converters::class)
abstract class ScoresDatabase : RoomDatabase() {
abstract val dao: ScoresDAO
}
Run Code Online (Sandbox Code Playgroud)
为了确认它有效,您应该在下一个版本的模块根目录中看到新创建的schemas目录,如下所示。
归档时间: |
|
查看次数: |
82051 次 |
最近记录: |