web-dev-qa-db-ja.com

Room - スキーマエクスポートディレクトリがアノテーションプロセッサに提供されていないため、スキーマをエクスポートできません

Android Database Component Roomを使用しています

私はすべてを設定しました、しかし、私がコンパイルするとき、Android Studioは私にこの警告を与えます:

スキーマエクスポートディレクトリはアノテーションプロセッサに提供されていないので、スキーマをエクスポートすることはできません。 room.schemaLocationアノテーションプロセッサの引数OR exportSchemaをfalseに設定することもできます。

私が理解しているように、DBファイルが配置される場所です

アプリにどのような影響がありますか?ここでベストプラクティスは何ですか?デフォルトの場所(falseの値)を使うべきですか?

242
Misha Akopov

docs :に従って

アノテーションプロセッサの引数(room.schemaLocation)を設定して、Roomにスキーマをフォルダにエクスポートするように指示できます。必須ではありませんが、コードベースにバージョン履歴を含めることをお勧めします。そのファイルをバージョン管理システムにコミットする必要があります(ただし、アプリには付属しないでください)。

そのため、スキーマをチェックする必要がなく、警告を取り除きたい場合は、次のようにRoomDatabaseexportSchema = 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\")"
    ]
  }
}

私の理解が正しいのであれば、データベースのバージョンが更新されるたびにそのようなファイルが作成されるので、データベースの履歴を簡単に確認できます。

270
DoruChidean

アプリケーションモジュールの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)

}

// ...
272
mikejonesguy

コトリン?さあ:

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

116
Ivanov Maksim

@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())
    }

    // [...]
}
4
chebaby

上記の答えは正しいです。このバージョンは従うのが簡単です:

「スキーマエクスポートディレクトリは注釈プロセッサに提供されない」ので、スキーマエクスポート用のディレクトリを提供する必要があります。

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()

3
LunaRivolxoxo