Androidルームの永続性:AppDatabase_Implは存在しません


147

私のアプリデータベースクラス

@Database(entities = {Detail.class}, version = Constant.DATABASE_VERSION)
public abstract class AppDatabase extends RoomDatabase {

    private static AppDatabase INSTANCE;

    public abstract FavoritesDao favoritesDao();

    public static AppDatabase getAppDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE =
                    Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, Constant.DATABASE).allowMainThreadQueries().build();

                    //Room.inMemoryDatabaseBuilder(context.getApplicationContext(),AppDatabase.class).allowMainThreadQueries().build();
        }
        return INSTANCE;
    }

    public static void destroyInstance() {
        INSTANCE = null;
    }
}

Gradle lib:

 compile "android.arch.persistence.room:runtime:+"   
 annotationProcessor "android.arch.persistence.room:compiler:+"

そして、私がインスタンスを要求すると、このエラーが発生します、AppDatabase_Implがアプリケーションクラスに存在しません

public class APp extends Application {

    private boolean appRunning = false;

    @Override
    public void onCreate() {
        super.onCreate();
        AppDatabase.getAppDatabase(this); //--AppDatabase_Impl does not exist

    }   

}

適切なlogcatエラーを提供できますか?
デバンジャン、

1
原因:java.lang.RuntimeException:AppDatabaseの実装が見つかりません。AppDatabase_Implは存在しません
pratik deshai

ルームスキーマの場所をgradleで提供しましたか?
デバンジャン、

1
@pratikdeshaiこの問題の解決策はありましたか?私も同じ問題を抱えています。
Krunal

私の場合、修正するためにkotlinプラグインを削除しました。プラグイン適用されます: 'kotlin-kapt'
ナポレオン

回答:


303

Kotlinを使用しannotationProcessorている場合kaptは、アプリでに変更してみてくださいbuild.gradle

例えば:

// Extensions = ViewModel + LiveData
implementation "android.arch.lifecycle:extensions:1.1.0"
kapt "android.arch.lifecycle:compiler:1.1.0"
// Room
implementation "android.arch.persistence.room:runtime:1.0.0"
kapt "android.arch.persistence.room:compiler:1.0.0"

このプラグインを追加することも忘れないでください

apply plugin: 'kotlin-kapt'

アプリレベルのbuild.gradleファイルの先頭に移動し、クリーンアップと再ビルドを行います(https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6に従って)

Android Studioで、コードの貼り付け時またはビルドプロセス中にエラーが発生した場合は、[ビルド]> [プロジェクトのクリーンアップ]を選択します。次に、[ビルド]> [プロジェクトの再ビルド]を選択してから、もう一度ビルドします。


更新

androidxに移行した場合

def room_version = "2.2.3" // check latest version from docs

implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"

2
どうもありがとう。Kotlinに移動すると、すべてのテストケースが失敗し始めました。私の頭を叩いていた。それから私は誤ってこのコメントを見ました。私の日を救った。
Ozeetee

77
またapply plugin: 'kotlin-kapt'、アプリレベルbuild.gradleファイルの先頭に追加する必要があります
daka

1
これは私を救ってくれました... Googleが適切なエラーを表示することにもっと取り組むべきだと思います... kapt呼び出しをしましたが、apply kapt-pluginを追加しませんでした
anoop4real

昨日から行き詰まりました。どうもありがとう。どうしてグーグルの人々がドキュメントでこれについて言及しないのか分かりません。
Shubham Anand

あなたはGOATです
。Gradleの

82

使うだけ

apply plugin: 'kotlin-kapt'

アプリのbuild.gradle

そして、両方を依存関係に保ちます

annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion"
kapt "android.arch.persistence.room:compiler:$rootProject.roomVersion"

編集

新しいバージョンでは、一度に両方の依存関係を追加する必要はありません。

kapt 'android.arch.persistence.room:compiler:1.1.1'

22

私が逃したときに私はこのエラーがありました

@Database(entity="{<model.class>})

上記のアノテーションで指定されたエンティティモデルが特定のモデルクラスを参照していることを確認し、必要なアノテーションも確認してください。

@Entity(tableName = "<table_name>" ...)

正しく定義されていて、あなたは良いでしょう


1
明確にするために、これはDBクラス定義のすぐ上にあります。それは私の問題を解決したようです-ありがとう!
18年

19

kotlinクラスを使用してデータベースを実装している場合は、

apply plugin: 'kotlin-kapt'

そして

kapt "android.arch.persistence.room:compiler:1.1.1"

あなたのgradleファイルで、それは動作します。


これはAndroid Studio 3.5で機能します(ただし、現在のルームコンパイラのバージョンは2.1.0です)
Yennefer

ほとんどの人はプロジェクト全体でandroidxライブラリを使用していなかったと思います...そのため、1.1.1を提案しました...私自身はコンパイルの問題に直面し、古いバージョンを使用して最小限の変更で安全を感じました。
navalkishoreb

11

依存関係を更新するだけではありません。Roomのすべての依存関係が同じバージョンであることを確認してください。

implementation 'android.arch.persistence.room:rxjava2:1.1.0-alpha2'
implementation 'android.arch.persistence.room:runtime:1.1.0-alpha2'
annotationProcessor "android.arch.persistence.room:compiler:1.1.0-alpha2"

上記のサンプルスニペットでは、Roomのすべての依存関係が同じバージョンです 1.1.0-alpha2


11

Kotlin開発者向け

これを使って:

implementation "android.arch.persistence.room:runtime:1.0.0"
kapt "android.arch.persistence.room:compiler:1.0.0"

apply plugin: 'kotlin-kapt'アプリレベルの一番上に追加しますbuild.gradle

Java開発者向け

implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"

違う答え!
ペドロマサンゴ

どうしてこれが違う男なの?
Patrick Prakash

7

適切な依存関係を忘れてしまったので、この問題に遭遇しました

implementation "android.arch.lifecycle:extensions:$archLifecycleVersion"
implementation "android.arch.persistence.room:runtime:$archRoomVersion"
annotationProcessor "android.arch.lifecycle:compiler:$archLifecycleVersion"
annotationProcessor "android.arch.persistence.room:compiler:$archRoomVersion"

annotationProcessorを追加して再構築すると、問題は解決しました。


7

私は@Dao注釈を忘れたので、問題に遭遇します

@Dao
public interface SearchHistoryDao {
    @Query("SELECT * FROM search_history")
    List<SearchHistory> getAll();

    @Insert
    void insertAll(SearchHistory... histories);

    @Delete()
    void delete(SearchHistory history);
}

ルーム公式チュートリアル


私も忘れました。ありがとうございました:)しかし、まだクラッシュしました:(
coinhndp

1
kaptを追加することで修正
coinhndp

7

build.gradleでルームの正しい依存関係を必ず追加してください

ext {
   roomVersion = '2.1.0-alpha06'
}

// Room components
implementation "androidx.room:room-runtime:$rootProject.roomVersion"
implementation "androidx.room:room-ktx:$rootProject.roomVersion"
kapt "androidx.room:room-compiler:$rootProject.roomVersion"
androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion"

そして上部のラインの下

apply plugin: 'kotlin-kapt'

5

質問はかなり古いですが、今日私はこれに出くわしました。提供された回答のどれも私を助けませんでした。最後に、Google ドキュメントは実際にはJavaに実際に採用されており、デフォルトではKotlinではなく、実際には無視されているコメントが追加されていることに気づくことで解決できました

Kotlinの場合、annotationProcessorの代わりにkaptを使用します

したがって、代わりに

annotationProcessor "androidx.room:room-compiler:$room_version"

Kotlinで開発している場合は、以下を使用する必要があります。

    kapt "androidx.room:room-compiler:$room_version"

4

同じ問題があった。Android Studioによって作成された新しいサンプルプロジェクトで公式に伝えられたいくつかのクラスとインターフェースを実装しました:https : //developer.android.com/training/data-storage/room/

上記のすべての解決策は役に立たず、私のデータベースクラスに応じて必要な_ImplファイルがRoomによって生成されませんでした。最後にターミナルでgradle clean buildを実行すると、解決策につながるヒントが得られました:

「警告:スキーマエクスポートディレクトリが注釈プロセッサに提供されていないため、スキーマをエクスポートできません。room.schemaLocation注釈プロセッサの引数を指定するか、exportSchemaをfalseに設定できます。」

データベースクラスにパラメータexportSchema = falseを追加しました

@Database(entities = arrayOf(User::class), version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

そして、それは機能し、generateJavaの下のappモジュールでこれらの2つの生成されたファイルを見つけました:

  • AppDatabase_Impl
  • UserDao_Impl

パラメータはオプションであると言われているので、この動作を理解できません。https://stackoverflow.com/a/44645943/3258117を参照して ください


1
ターミナルから./gradlew clean buildを実行することが重要でした。私には次のメッセージが表示されました:app: 'annotationProcessor'依存関係はkaptアノテーションプロセッサとして認識されません。これらのアーティファクトの設定名を「kapt」に変更してください:「android.arch.lifecycle:compiler:1.1.1」、kaptプラグインを適用してください:「apply plugin: 'kotlin-kapt'」。
ランディ

ああそうです、ターミナルでタスクを実行することは、以前にも私を助けました。IDEのビルドツールメッセージは、元のエラーメッセージをしばしば「隠す」
Hajo

3

次のgradleリンクを使用してください:

compile 'android.arch.persistence.room:runtime:1.0.0-alpha9'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0-alpha9'

次のように、diffretn singlotonクラスを作成し、そこからAppdatabaseを取得する必要があります。

RoomDB.java

public class RoomDB {

private static RoomDB INSTANCE;

public static AppDatabase getInstance(Context context) {
    if (INSTANCE == null) {
        INSTANCE =
                Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, Constant.DATABASE).allowMainThreadQueries().build();

                //Room.inMemoryDatabaseBuilder(context.getApplicationContext(),AppDatabase.class).allowMainThreadQueries().build();
    }
    return INSTANCE;
}

public static void destroyInstance() {
    INSTANCE = null;
}

App.java

public class App extends Application {

private boolean appRunning = false;

@Override
public void onCreate() {
    super.onCreate();
    RoomDB.getInstance(this); //This will provide AppDatabase Instance
}

私はコンストラクタを作成していません。静的インスタンスを介して直接使用しています。
pratik deshai 2017年

Roomデータベースのサンプルプロジェクトを作成しました。ここで確認できます:github.com/burhanrashid52/Android-Room-Data-Persistent
Burhanuddin Rashid

2
はい私は更新しましたが、同じエラー、AppDatabase_Implは存在しません
pratik deshai

@pratikdeshai:そのエラーを修正しましたか?私も同じエラーが出ます、これが原因で行き詰まります。
Jayesh

2

私の場合、ルームデータベースの接続をテストしており、AndroidTestフォルダー内に作成したディレクトリ内にテストクラスを配置しました。私はそれをカスタムディレクトリの外に移動しました、そしてそれはそれはかなりうまくいきました。


これも私の問題です。なぜこれが起こっているのか、これを回避する方法はありますか?私TestDatabaseはリリースコードにを含めない方がいいと思います。
エドゥアルド

2

同じ現象が私にも起こりました。

以下

implementation "android.arch.persistence.room:runtime:1.1.1"

追加すると、別のビルドエラーが発生しますが、ログから原因が追跡されます。

私の場合、SQL実装にエラーがありました。修正後、ビルドは成功しました。

そのため、クラッシュしたローカルを調べる代わりに、ルームライブラリ全体の実装を確認することをお勧めします。


1

問題は、gradleビルドに含まれていない正しいライブラリに関係しています。同様の問題があり、不足している

testImplementation "android.arch.persistence.room:testing:$room_version


1

私のgradleファイルの依存関係を変更しても、エラーを修正するのに役立ちませんでした.Roomデータベースが初期化されているクラスでこのデータベース注釈を見逃していたため、この問題が発生していました。

@Database(entities = [UserModel :: class]、version = 1)

上記のアノテーションで指定されたエンティティモデルが特定のモデルクラスを参照していることを確認してください


これは私が逃したものです
pjwin

0

私にとって、Android Studioは、Roomデータベースに関連するインポートを含めるとすぐに、依存関係を自動的に更新しました。しかし、https://developer.android.com/jetpack/androidx/releases/room#declaring_dependenciesによると、いくつかを更新する必要があります。これが私のコードベースがどのように見えるかです:

AppDatabase.kt

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(entities = arrayOf(MyEntity::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun myDAO(): MyDAO

    companion object {
        @Volatile private var instance: AppDatabase? = null
        private val LOCK = Any()

        operator fun invoke(context: Context)= instance ?: synchronized(LOCK){
            instance ?: buildDatabase(context).also { instance = it}
        }

        private fun buildDatabase(context: Context) = Room.databaseBuilder(context,
            AppDatabase::class.java, "db-name.db")
            .build()
    }
}

答えの1つで指定されているようにbuild.gradleを更新します。

apply plugin: 'kotlin-kapt' // this goes with other declared plugin at top
dependencies { // add/update the following in dependencies section
    implementation 'androidx.room:room-runtime:2.2.3'
//    annotationProcessor 'androidx.room:room-compiler:2.2.3' // remove this and use the following
    kapt "androidx.room:room-compiler:2.2.3"

}

Gradleを同期すれば、問題ありません。


0

ここで例を読む: 部屋の例

次のように、正しい(おそらくそうである)注釈プロセッサフ​​ァイルを使用してこのエラーを修正しました。

annotationProcessor "android.arch.persistence.room:compiler:<latest_version>"

また、ライフサイクルバージョンと同様に、ルームバージョンでも2.2.0にアップグレードしました。

graddleを同期したら、Roomでの作業を開始できます。

とても幸運!そして、コードを一緒にしましょう!


0

私のkotlinアプリでは、build.gradleファイルの先頭に次の行を追加しました。

apply plugin: 'kotlin-kapt'

そして、依存関係セクションの次の行:

kapt "androidx.room:room-compiler:2.2.5"

問題が解決することを願っています。


0

OPの場合ではありませんが、次のように、annotationProcessorの代わりに実装を誤って使用した場合にも発生します。

implementation "android.arch.persistence.room:compiler:x.x.x"

これの代わりに:

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