Android 룸 지속성 : AppDatabase_Impl이 존재하지 않습니다.


148

내 앱 데이터베이스 클래스

@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 오류를 제공 할 수 있습니까?
Debanjan

1
원인 : java.lang.RuntimeException : AppDatabase에 대한 구현을 찾을 수 없습니다. AppDatabase_Impl이 존재하지 않습니다
pratik deshai

회의실 스키마 위치를 gradle로 제공 했습니까?
Debanjan

1
@pratikdeshai이 문제에 대한 해결책을 얻었습니까? 나는 또한 같은 문제가 있습니다.
Krunal

내 경우에는 kotlin 플러그인을 제거하여 수정했습니다. 플러그인 적용 : '코 틀린-kapt'
나폴레옹

답변:


304

작업 사람들을 위해 코 틀린 변화 시도 annotationProcessorkapt애플 리케이션에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-plugin 적용을 추가하지
않았습니다

어제부터 붙어있었습니다. 고마워 왜 구글 사람들이 문서에서 이것을 언급하지 않는지 이해하지 못합니다.
Shubham Anand

당신은 염소가 빠른 gradle 수정으로 나를 구해주었습니다
Fanadez

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 클래스 정의 바로 위에 있습니다. 문제가 해결 된 것 같습니다. 감사합니다!
36

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

의존성을 업데이트하는 것이 아닙니다. 모든 룸 종속성이 동일한 버전인지 확인하십시오.

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"

위의 샘플 스 니펫에서 모든 내 룸 종속성의 버전이 동일합니다 1.1.0-alpha2


11

코 틀린 개발자를위한

이것을 사용하십시오 :

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

그리고 apply plugin: 'kotlin-kapt'앱 레벨 상단에 추가하십시오 build.gradle.

자바 개발자

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

다른 답변!
페드로 Massango

이 친구는 어떻게 다른가요?
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 문서가 실제로 Kotlin이 아닌 Java에 여전히 채택되어 있음을 알면서 문제를 해결했습니다 . 실제로 그들은 무시한 주석을 추가했습니다.

Kotlin의 경우 annotationProcessor 대신 kapt를 사용하십시오.

그래서 대신

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

Kotlin으로 개발하는 경우 다음을 사용해야합니다.

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

4

같은 문제가 있었다. 안드로이드 스튜디오에서 만든 새로운 예제 프로젝트에서 공식적으로 말한 것처럼 몇 가지 클래스와 인터페이스를 구현했습니다 : 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
}

그런 다음 앱 모듈에서 generatedJava의 다음 두 생성 파일을 찾았습니다.

  • AppDatabase_Impl
  • UserDao_Impl

매개 변수가 선택 사항이라고 말하면서이 동작을 이해하지 못합니다. https : //.com/a/44645943/3258117


1
터미널에서 ./gradlew clean 빌드를 실행하는 것이 핵심이었습니다. 나 에게이 메시지가 나타납니다 : 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


2
그래, 난 업데이트하지만 문턱 같은 오류가 AppDatabase_Impl가 존재하지 않습니다
pratik deshai

@ pratikdeshai : 그 오류를 수정 했습니까 ?? 나는 또한 같은 오류가 발생합니다.
Jayesh

2

필자의 경우 방 데이터베이스의 연결을 테스트하고 AndroidTest 폴더 내에 만든 디렉토리에 테스트 클래스를 넣었습니다. 나는 그것을 커스텀 디렉토리에서 옮겼다.


이것은 내 문제이기도합니다. 왜 이런 일이 일어나고 어떻게 피할 수 있습니까? TestDatabase릴리스 코드를 사용 하지 않는 것이 좋습니다.
Eduardo Eduardo

2

나에게도 같은 현상이 일어났다.

수행원

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

추가하면 다른 빌드 오류가 발생하지만 로그에서 원인을 추적합니다.

필자의 경우 SQL 구현에 오류가있었습니다. 수정 후 빌드가 완료되었습니다.

따라서 충돌 지역을 보지 않고 전체 방 라이브러리의 구현을 확인하고 싶을 수도 있습니다.


1

문제는 gradle 빌드에 포함되지 않은 올바른 라이브러리와 관련이 있습니다. 비슷한 문제가 있었고 누락 된 항목을 추가했습니다.

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


1

내 gradle 파일의 종속성을 변경해도 오류를 수정하는 데 도움이되지 않았습니다. 룸 데이터베이스가 초기화 된 클래스 에서이 데이터베이스 주석이 누락 되어이 문제가 발생했습니다.

@ 데이터베이스 (엔터티 = [UserModel :: class], 버전 = 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()
    }
}

답변 중 하나에 지정된대로 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>"

또한 Lifecycle 버전과 마찬가지로 Room Version에서 2.2.0으로 업그레이드했습니다.

Graddle을 동기화하면 Room 작업을 시작할 수 있습니다.

행운을 빌어 요! 그리고 코드가 당신과 함께하게하십시오!


0

내 kotlin 앱에서 방금 build.gradle 파일 맨 위에 다음 줄을 추가했습니다.

apply plugin: 'kotlin-kapt'

그리고 dependencies 섹션의 다음 줄 :

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.