ルーム-スキーマエクスポートディレクトリが注釈プロセッサに提供されていないため、スキーマをエクスポートできません


349

Androidデータベースコンポーネントルームを使用しています

すべてを設定しましたが、コンパイルすると、Android Studioから次の警告が表示されます。

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

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

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

回答:


395

あたりとして、ドキュメント

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

したがって、スキーマをチェックする必要がなく、警告を取り除きたい場合は、次のようにに追加exportSchema = falseしますRoomDatabase

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

以下の@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\")"
    ]
  }
}

私の理解が正しければ、データベースのバージョンが更新されるたびにそのようなファイルが得られるので、dbの履歴を簡単に追跡できます。


7
「アプリに同梱しない」とはどういう意味ですか?APKに含まれますか?
Jongz Puangput

2
「アプリに同梱しない」に従っている場合、APKを生成する前にJSONファイルを削除する必要がありますか?
illusionJJ

7
「アプリに同梱しない」とは、「schemaLocationを「app / res / raw」のように設定しないでください。schemaLocationをAPKに含まれていないディレクトリに設定してください。」
galcyurio 2018

3
@galcyurio $ projectDir / schemasはAPKのディレクトリですよね?生成されたAPKを調べましたが、そこには表示されません。たとえば、/ res(app / src / main / resのアカウント)が表示されますが。
xarlymg89 2018

1
@glucaio APK(およびApp Bundleも)を調べたところ、見つかりませんでした。だから私たちは安全だと思います。
xarlymg89

388

では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)

}

// ...

34
誰かが不思議に思っている場合、kapt
DanielDiSu

1
app/schemasこの操作でディレクトリに生成されたjsonファイルをgitignoreする必要があります。また、スキーマをに含まれていないディレクトリに配置する必要があると聞きましたapk。どうすればできるでしょうか?
ラビ2018

2
これは、データベースは、データベースのバージョンを更新し、移行計画を作成して変更した場合に確実に変化し、助けを検出するために、ルームで使用されているよう@ravi生成されたスキーマファイル(複数可)、バージョン管理に格納する必要があります
appmattus

1
この構成はリリースバージョンに影響しますか?つまり、プロジェクトをリリースアプリにエクスポートするときです。
Anargu

このソリューションでエラーが発生した場合:引数のメソッドannotationProcessorOptions()が見つかりませんでした。以下のLunaの回答を確認してください:stackoverflow.com/a/54366985/1617737
ban-geoengineering

184

コトリン?さあ行こう:

android {

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

    defaultConfig {

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

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

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

//...

プラグインを忘れないでください:

apply plugin: 'kotlin-kapt'

Kotlin注釈プロセッサの詳細については、次のWebサイトをご覧ください。Kotlinの ドキュメント


あなたがそれに答えた方法のように:D
theapache64

12

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

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

ステップ[1] RoomDatabaseを拡張するファイルで、行を次のように変更します。

`@Database(entities = ???.class,version = 1, exportSchema = true)`

または

`@Database(entities = ???.class,version = 1)` 

(デフォルト値は常にtrueであるため)

あなたbuild.gradle(プロジェクト:????)中の工程[2]内のファイル、defaultConfig {} (内部にあるアンドロイド{}大部分)、追加javaCompileOptionsを{}セクションでは、それは次のようになります。

         android{
                defaultConfig{
                      //javaComplieOptions SECTION
                      javaCompileOptions {
                            annotationProcessorOptions {
                                     arguments = ["room.schemaLocation":"$projectDir/schemas".toString()]
                            }
                       }
                      //Other SECTION
                      ...
                }
         }

$ projectDir:は変数名です。変更することはできません。あなた自身のプロジェクトディレクトリを取得します

schemasは文字列です。好きなように変更できます。例えば: "$projectDir/MyOwnSchemas".toString()


ステップ[2]で、それはでbuild.gradle(project:????)あり、そうではありませんbuild.gradle(app:????)か?
エース

9

@mikejonesguyの回答は完璧です。部屋の移行をテストする予定の場合に備えて(推奨)、スキーマの場所をソースセットに追加します。

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

    // [...]
}

3

私が使用し.ktsGradleのファイル(Kotlin GradleのDSL)やkotlin-kaptプラグインを私はイワノフマクシムの答えを使用するとき、私はまだスクリプトのコンパイル・エラーが発生します。

Unresolved reference: kapt

私にとってこれがうまくいった唯一のものでした:

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

何もうまくいきません。私はKotlinを使用しています。
nyxee

0

おそらくあなたの部屋のクラスを子のRoomDatabase子クラスに追加しませんでした@Database(entities = {your_classes})

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.