Sala Android persistente: AppDatabase_Impl não existe

147

Classe do banco de dados do meu aplicativo

@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:+"

E quando eu pedir, por exemplo, ele dará esse erro, AppDatabase_Impl não existe na minha classe de aplicativo

public class APp extends Application {

    private boolean appRunning = false;

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

    }   

}
pratik deshai
fonte
Você pode fornecer o erro correto de logcat que está recebendo?
Debanjan
1
Causado por: java.lang.RuntimeException: não foi possível encontrar a implementação do AppDatabase. AppDatabase_Impl não existe
pratik deshai 10/10
Você forneceu a localização do esquema da sala em gradle?
Debanjan
1
@pratikdeshai Você conseguiu alguma solução para esse problema? Eu também estou tendo o mesmo problema.
quer
No meu caso, removi o plugin kotlin para corrigi-lo. apply plugin: 'kotlin-kapt'
Napolean

Respostas:

303

Para aqueles que trabalham com Kotlin , tente mudar annotationProcessorpara kaptnos aplicativosbuild.gradle

por exemplo:

// 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"

lembre-se de adicionar este plugin

apply plugin: 'kotlin-kapt'

na parte superior do arquivo build.gradle no nível do aplicativo e faça uma limpeza e reconstrução (de acordo com https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6 )

No Android Studio, se você receber erros ao colar o código ou durante o processo de compilação, selecione Compilar> Limpar projeto. Em seguida, selecione Build> Rebuild Project e, em seguida, construa novamente.


ATUALIZAR

Se você migrou para o 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"
RWIL
fonte
2
Muito obrigado. Acabei de me mudar para Kotlin e todos os meus casos de teste começaram a falhar. Estava batendo na minha cabeça. Então acidentalmente vi esse comentário. Salvou o meu dia.
Ozeetee
77
Também precisa adicionar apply plugin: 'kotlin-kapt'ao topo do nível de aplicativo build.gradlearquivo
daka
1
Isso me salvou .... eu acho que o Google deve trabalhar mais em mostrando erro adequado ... Eu tinha chamada Kapt mas eu não adicionar aplicar Kapt-plugin
anoop4real
Estava preso desde ontem. Muito obrigado. Não entendo por que as pessoas do google não mencionam isso na documentação.
Shubham Anand
Você é o GOAT que me salvou com aquela correção rápida de graduação #
Fanadez 19/11/19
82

Apenas use

apply plugin: 'kotlin-kapt'

no aplicativo build.gradle

E mantenha ambos em dependências

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

EDITAR

Na versão mais recente, não é necessário adicionar as duas dependências por vez. Basta usar, espero que funcione.

kapt 'android.arch.persistence.room:compiler:1.1.1'
Jahangir Kabir
fonte
22

Eu tive esse erro quando perdi

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

Certifique-se de que o modelo de entidade especificado na anotação acima se refira à classe de modelo específica e também garanta que a anotação necessária:

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

está definido corretamente e você seria bom

Thadeus Ajayi
fonte
1
Para maior clareza, isso fica imediatamente acima da definição da classe DB. Parece ter corrigido o meu problema - obrigado!
winwaed 02/06/19
19

Se você estiver usando classes kotlin para implementar banco de dados, use

apply plugin: 'kotlin-kapt'

e

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

no seu arquivo gradle, ele funcionará.

navalkishoreb
fonte
Isso funciona em Android Estúdio 3.5 (no entanto, a versão atual do compilador quarto é 2.1.0)
Yennefer
Acho que a maioria das pessoas não estava usando a biblioteca androidx em todo o projeto ... por isso sugeri a 1.1.1 ... eu mesmo enfrentei problemas de compilação e me senti seguro com o mínimo de alterações usando a versão mais antiga.
navalkishoreb
11

Não se trata apenas de atualizar suas dependências. Verifique se todas as dependências da sala têm a mesma versão.

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"

No snippet de amostra acima, todas as minhas dependências da sala têm a mesma versão 1.1.0-alpha2

Idee
fonte
11

Para desenvolvedores Kotlin

Usa isto:

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

E adicione apply plugin: 'kotlin-kapt'ao topo do nível do aplicativo build.gradle.

Para desenvolvedores Java

implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
Pedro Massango
fonte
Respostas diferentes!
Pedro Massango
Como é que isso é cara diferente?
Patrick Prakash
7

Encontrei esse problema porque esqueci as dependências do apt

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"

depois de adicionar o annotationProcessor e reconstruí-lo, o problema foi resolvido.

ahsiu
fonte
7

Eu me deparo com o problema, porque esqueci a @Daoanotação

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

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

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

Tutorial oficial da sala

shellhub
fonte
Eu também esqueci. Obrigado :) Mas ainda crashh :(
coinhndp
1
Correção adicionando kapt
coinhndp
7

certifique-se de adicionar a dependência correta para o espaço no 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"

E abaixo da linha no topo

apply plugin: 'kotlin-kapt'
Deepak
fonte
5

A pergunta é bem antiga, mas eu me deparei com isso hoje e nenhuma das respostas fornecidas me ajudou. Finalmente, consegui resolvê-lo percebendo que a documentação do Google ainda é adotada no Java e não no Kotlin por padrão. Na verdade, eles adicionaram um comentário que eu ignorei

Para o Kotlin, use o kapt em vez de annotationProcessor

Então, ao invés de

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

Se você estiver desenvolvendo com o Kotlin, use:

    kapt "androidx.room:room-compiler:$room_version"
Pavel
fonte
4

Teve o mesmo problema. Implementou as poucas classes e interfaces conforme oficialmente relatadas em um novo projeto de exemplo criado pelo Android Studio: https://developer.android.com/training/data-storage/room/

Todas as soluções mencionadas acima não ajudaram, os arquivos _Impl necessários de acordo com a minha classe de banco de dados não foram gerados pelo Room. Finalmente, a execução de gradle clean build no terminal deu-me a dica que levou à solução:

"aviso: o diretório de exportação do esquema não é fornecido ao processador de anotações, portanto não podemos exportar o esquema. Você pode fornecer o room.schemaLocationargumento do processador de anotações OU definir exportSchema como false."

Adicionei o parâmetro exportSchema = false na classe de banco de dados

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

E então funcionou, encontrou esses dois arquivos gerados no módulo de aplicativo em generateJava:

  • AppDatabase_Impl
  • UserDao_Impl

Eu não entendo esse comportamento, pois o parâmetro é opcional, consulte https://stackoverflow.com/a/44645943/3258117

Hajo
fonte
1
Executar a versão limpa do ./gradlew a partir do terminal foi a chave. Para mim, recebi esta mensagem: as dependências app: 'annotationProcessor' não serão reconhecidas como processadores de anotação kapt. Altere o nome da configuração para 'kapt' para esses artefatos: 'android.arch.lifecycle: compiler: 1.1.1' e aplique o plugin kapt: "apply plugin: 'kotlin-kapt'".
Randy
Ah, sim, executar as tarefas no terminal também me ajudou muito no passado. As mensagens das ferramentas de compilação no IDE geralmente "ocultam" a mensagem de erro original
Hajo
3

Use o seguinte link gradle:

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

Você precisa criar diferentes classes de singlotons e obter o Appdatabase a partir desta forma:

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
}
Burhanuddin Rashid
fonte
Eu não criei o construtor, estou usando diretamente via instância estática.
pratik deshai
Eu criei um projeto de exemplo para banco de dados quarto você pode conferir aqui: github.com/burhanrashid52/Android-Room-Data-Persistent
Burhanuddin Rashid
2
Sim, eu atualizei, mas ainda o mesmo erro, AppDatabase_Impl não existe
pratik deshai 10/10
@pratikdeshai: Você corrigiu esse erro? Eu também recebo o mesmo erro, fico preso por causa disso.
214 Jayay
2

No meu caso, eu estava testando a conectividade para o banco de dados da sala e coloquei a classe de teste dentro do diretório que criei na pasta AndroidTest. Mudei para fora do diretório personalizado e funcionou muito bem.

Farruh Habibullaev
fonte
Este é o meu problema também. Alguma idéia de por que isso está acontecendo e como evitar isso? Prefiro não ter um TestDatabaseno código de lançamento.
Eduardo
2

O mesmo fenômeno me ocorreu.

Segue

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

A adição causa outro erro de construção, mas rastreia a causa no log.

No meu caso, houve um erro na implementação do SQL. Após a correção, a compilação foi bem-sucedida.

Portanto, convém verificar a implementação de toda a biblioteca da sala, em vez de examinar os locais afetados.

user11221761
fonte
1

O problema é mais sobre a biblioteca correta que não está incluída na compilação gradle. Eu tive um problema semelhante e adicionei o item ausente

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

Saurabh Sharma
fonte
1

Alterar as dependências no meu arquivo gradle não me ajudou a corrigir o erro. Eu havia perdido essa anotação de banco de dados na classe em que o banco de dados da sala foi inicializado, causando o problema.

@Database (entidades = [UserModel :: class], versão = 1)

Verifique se o modelo de entidade especificado na anotação acima se refere à classe de modelo específica

Wajhia Maqsood
fonte
isto é o que eu perdi
pjwin
0

Para mim, o Android Studio atualizou automaticamente as dependências assim que você incluir qualquer importação relacionada ao banco de dados da sala. Mas, de acordo com https://developer.android.com/jetpack/androidx/releases/room#declaring_dependencies, você precisa atualizar alguns. Aqui está como minha base de código se parece:

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

Atualize o build.gradle conforme especificado em uma das respostas:

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"

}

Sincronize o gradle e você deve estar pronto.

Rujoota Shah
fonte
0

Lendo o exemplo aqui: Exemplo de Sala

Corrigi esse erro usando apenas o correto (acho que é) annotationProcessorFile, da seguinte maneira:

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

Além disso, atualizei para o 2.2.0 na versão Room ou na versão Lifecycle.

Depois de sincronizar a grade, eu poderia começar a trabalhar com o Room.

Então boa sorte! E deixe o código estar com você!

Anibal Itriago
fonte
0

No meu aplicativo kotlin, acabei de adicionar a seguinte linha na parte superior do meu arquivo build.gradle:

apply plugin: 'kotlin-kapt'

E a seguinte linha na seção de dependências:

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

Espero que isso resolva seu problema.

ZakariaBK
fonte
0

Não no caso do OP, mas isso também acontece quando você usa a implementação por engano em vez do annotationProcessor como este:

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

Em vez disso:

annotationProcessor "android.arch.persistence.room:compiler:x.x.x"
artenson.art98
fonte