Android Database Component Roomを使用しています
私はすべてを設定しました、しかし、私がコンパイルするとき、Android Studioは私にこの警告を与えます:
スキーマエクスポートディレクトリはアノテーションプロセッサに提供されていないので、スキーマをエクスポートすることはできません。
room.schemaLocation
アノテーションプロセッサの引数OR exportSchemaをfalseに設定することもできます。
私が理解しているように、DBファイルが配置される場所です
アプリにどのような影響がありますか?ここでベストプラクティスは何ですか?デフォルトの場所(false
の値)を使うべきですか?
docs :に従って
アノテーションプロセッサの引数(room.schemaLocation)を設定して、Roomにスキーマをフォルダにエクスポートするように指示できます。必須ではありませんが、コードベースにバージョン履歴を含めることをお勧めします。そのファイルをバージョン管理システムにコミットする必要があります(ただし、アプリには付属しないでください)。
そのため、スキーマをチェックする必要がなく、警告を取り除きたい場合は、次のようにRoomDatabase
にexportSchema = false
を追加するだけです。
@Database(entities = { YourEntity.class }, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
//...
}
以下の@ mikejonesguy answer に従うと、ドキュメントに記載されているグッドプラクティスに従うことになります:)。基本的にあなたはあなたの.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\")"
]
}
}
私の理解が正しいのであれば、データベースのバージョンが更新されるたびにそのようなファイルが作成されるので、データベースの履歴を簡単に確認できます。
アプリケーションモジュールの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)
}
// ...
コトリン?さあ:
Android {
// ... (compileSdkVersion, buildToolsVersion, etc)
defaultConfig {
// ... (applicationId, miSdkVersion, etc)
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
}
buildTypes {
// ... (buildTypes, compileOptions, etc)
}
}
//...
プラグインを忘れないでください。
apply plugin: 'kotlin-kapt'
Kotlinアノテーションプロセッサの詳細については、次のURLをご覧ください。 Kotlin docs
@mikejonesguy answer 部屋の移行をテストする場合(推奨)に備えて、ソースセットにスキーマの場所を追加するのに最適です。
Build.gradleファイルで、これらの生成されたスキーマJSONファイルを配置するフォルダを指定します。スキーマを更新すると、各バージョンに1つずつ、いくつかのJSONファイルが作成されます。必ず生成されたすべてのファイルをソース管理にコミットしてください。次回バージョン番号をもう一度増やすと、RoomはJSONファイルをテストに使用できるようになります。
- フロリナムンテネスク( ソース )
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())
}
// [...]
}
上記の答えは正しいです。このバージョンは従うのが簡単です:
「スキーマエクスポートディレクトリは注釈プロセッサに提供されない」ので、スキーマエクスポート用のディレクトリを提供する必要があります。
Step [1] RoomDatabaseを拡張するファイルの中で、行を次のように変更します。
`@Database(entities = ???.class,version = 1, exportSchema = true)`
または
`@Database(entities = ???.class,version = 1)`
(デフォルト値は常にtrueであるため)
ステップ[2] build.gradle(project:????)ファイルのdefaultConfig {}内(Android {} bigセクション内)に_を追加します。javaCompileOptions {}セクションは、次のようになります。
Android{
defaultConfig{
//javaComplieOptions SECTION
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation":"$projectDir/schemas".toString()]
}
}
//Other SECTION
...
}
}
$ projectDir:は変数名です。変更することはできません。それはあなた自身のプロジェクトディレクトリを取得します
schemas:は文字列です。好きなように変更できます。例えば、"$projectDir/MyOwnSchemas".toString()