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

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

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

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

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


当前回答

在构建中。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)

}

// ...

其他回答

如果你像我一样最近移动某些类到不同的包等。你使用android导航。确保将argType更改为与您的新包地址匹配。 来自:

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

to:

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

@mikejonesguy答案是完美的,以防万一您计划测试房间迁移(推荐),将模式位置添加到源集。

在你的构建中。Gradle文件你指定一个文件夹来放置这些 生成模式JSON文件。当您更新您的模式时,您将结束 有几个JSON文件,每个版本一个。一定要承诺 每个生成的文件都交给源代码控制。下次你增加的时候 您的版本号再次,房间将能够使用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())
    }

    // [...]
}

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

Unresolved reference: kapt

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

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

在构建中。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)

}

// ...

Kotlin的方式根据官方文件:

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