programing

Android 룸 지속: AppDatabase_Impl이 없습니다.

copyandpastes 2022. 8. 10. 23:04
반응형

Android 룸 지속: AppDatabase_Impl이 없습니다.

내 앱 데이터베이스 클래스

@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;
    }
}

"lib" :

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

를 들어 오류가 내에 하지 않습니다.

public class APp extends Application {

    private boolean appRunning = false;

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

    }   

}

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에서 코드 붙여넣기 또는 빌드 프로세스 중에 오류가 발생하면 [Build]> [ Clean Project ]를 선택합니다.다음으로 [Build]> [ Rebuild Project ]를 선택하여 다시 빌드합니다.


갱신하다

Androidx로 이행한 경우

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

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

UPDATE 2 (2021년 7월 이후)

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

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

그냥 사용하다

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'

내가 놓쳤을 때 이 오류가 있었다.

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

위 주석에서 지정된 도면요소 모델이 특정 모델 클래스를 참조하는지 확인하고 필요한 주석이 다음과 같은지 확인하십시오.

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

제대로 정의되어 있고 당신은 좋은 사람이 될 것이다.

kotlin 클래스를 사용하여 데이터베이스를 구현하는 경우,

apply plugin: 'kotlin-kapt'

그리고.

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

그래들 파일 안에 있으면 될 거야

Kotlin 개발자용

사용방법:

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

리리 and and를 추가한다.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"

이것은 단지 당신의 의존관계를 갱신하는 것에 관한 것이 아닙니다.모든 회의실 종속 항목이 동일한 버전인지 확인합니다.

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

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'

나는 적절한 의존관계를 잊어버렸기 때문에 이 문제를 만났다.

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"

annotation Processor를 추가하고 재구축한 후 문제가 해결되었습니다.

그 . 가 잊어버렸기 때문이다.@Dao

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

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

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

룸 오피셜 튜토리얼

같은 문제가 있었어.Android Studio에 의해 작성된 새로운 예시 프로젝트에서 공식적으로 언급된 몇 가지 클래스와 인터페이스를 구현:https://developer.android.com/training/data-storage/room/

위의 모든 솔루션이 도움이 되지 않았습니다.데이터베이스 클래스에 따라 필요한 _Impl 파일은 Room에서 생성되지 않았습니다.마지막으로 gradle clean build in terminal을 실행한 결과 다음과 같은 힌트를 얻을 수 있었습니다.

" (경고) : 디렉토리가 주석 프로세서에 스키마 내보내기 디렉토리가 제공되지 않으므로 스키마를 내보낼 수 없습니다. 하다, 하다, 하다, 하다, 하다, 이렇게 할 수 요.room.schemaLocationexportSchema" 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://stackoverflow.com/a/44645943/3258117 를 참조해 주세요.

꽤 오래된 질문이지만, 오늘 우연히 이 질문을 발견했는데, 어떤 답변도 도움이 되지 않았습니다.결국 구글 문서가 Kotlin이 아닌 Java에 채택되어 있다는 것을 알게 되었습니다.사실 그들은 제가 무시한 코멘트를 추가했습니다.

Kotlin의 경우 annotation Processor 대신 kapt를 사용합니다.

그래서 대신

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

Kotlin과 함께 개발하는 경우 다음을 사용해야 합니다.

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

「 」를 사용하고 kotlin에 kotlin 추가, kotlin annotation 추가, cotlin annotation processor plugin 。build.gradle

plugins {
    id "org.jetbrains.kotlin.kapt"
}

「」도 합니다.annotationProcessor ㅇㅇㅇㄹㄹㄹㄹㄹㄹㄹㄹ and and and 。kapt

  • 대신
dependencies {
    def room_version = "2.3.0"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
}
  • 사용하다
dependencies {
    def room_version = "2.3.0"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
}

annotationProcessor【Java.kapt자바와 코틀린을 모두 돌봅니다.구현에 문제가 있는 경우 이러한 플러그인은 컴파일 시 표시됩니다.

kotlin 앱에서 build.gradle 파일 맨 위에 다음 행을 추가했습니다.

apply plugin: 'kotlin-kapt'

의존관계 섹션의 다음 행은 다음과 같습니다.

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

문제가 해결되길 바랍니다.

제 경우 회의실 데이터베이스 접속 테스트를 하고 있었는데 AndroidTest 폴더 내에 작성한 디렉토리에 테스트 클래스를 넣었습니다.커스텀 디렉토리에서 옮겨놨는데 잘 작동했어요.

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

다음에 나오는

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

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

제 경우 SQL 구현에서 오류가 발생했습니다.수정 후, 빌드는 성공했습니다.

그러므로 당신은 추락한 지역 주민들을 보는 대신 전체 방 도서관의 구현을 체크하는 것이 좋을지도 모른다.

:아래gradle 링크를 사용합니다.

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

당신은, 여기에서 이렇게 AppDatabase을 다른 singleton클래스를 만드는 방법:필요가 있다.

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
}

위의 답변에 동의합니다.

해결방법은 다음과 같습니다.주석 프로세서를 다음과 같이 kapt로 변경합니다.

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

이 문제는 gradle build에 포함되지 않은 올바른 라이브러리에 관한 것입니다.나는 비슷한 문제가 있어서 누락된 부분을 추가했다.

test Implementation "android.arch.persistence.room: 테스트: $room_version

gradle 파일에서 종속성을 변경해도 오류를 수정하는 데 도움이 되지 않았습니다.강의실 데이터베이스가 초기화된 수업에서 이 데이터베이스 주석을 놓쳤기 때문에 이 문제가 발생하였습니다.

@Database(엔티티 = [UserModel::class], 버전 = 1)

위 주석에서 지정된 엔티티 모델이 특정 모델 클래스를 참조하는지 확인하십시오.

Kotlin 개발자용


Dao와 Entity를 확인하고 Kapt를 사용했는데 문제가 없다면 kotlin 1.4 이상을 사용한다면 kotlin 버전에 문제가 있을 것입니다. 링크에서 회의실을 최신 버전으로 업데이트합니다.


2.3.0-alpha03으로 문제가 해결되었습니다.

Android Studio는 회의실 데이터베이스 관련 가져오기를 포함하면 바로 종속성을 자동으로 업데이트했습니다.그러나 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"

}

그래플을 동기화하면 갈 수 있을 거야

누락과 더불어

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

나는 또한 우리 반에서 아래 주석을 추가하는 것을 놓쳤다.

@Entity(tableName = "mytablename")

예제를 읽다: 회의실

이 에러는 다음과 같이 올바른(아마도) annotation Processor File을 사용하여 수정했습니다.

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

또한 Lifecycle 버전처럼 Room 버전 중 하나로 2.2.0으로 업그레이드하였습니다.

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

행운을 빌어요!그리고 그 암호를 너와 함께 두어라!

OP의 경우는 아니지만 annotation Processor가 아닌 구현을 잘못 사용한 경우에도 발생합니다.

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

이것 대신:

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

나와 같은 실수를 저지를 경우를 대비해서 데이터베이스 클래스를 "데이터베이스"라고 부르지 마십시오. 그렇지 않으면 동일한 오류가 발생합니다.

언급URL : https://stackoverflow.com/questions/46665621/android-room-persistent-appdatabase-impl-does-not-exist

반응형