Android odası kalıcı: AppDatabase_Impl mevcut değil


148

Uygulama veritabanı sınıfım

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

Örneğin istediğimde bu hatayı verir, uygulama sınıfımda AppDatabase_Impl yok

public class APp extends Application {

    private boolean appRunning = false;

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

    }   

}

Uygun logcat hatasını verebilir misiniz, alıyorsunuz?
Debanjan

1
Nedeni: java.lang.RuntimeException: AppDatabase için uygulama bulunamadı. AppDatabase_Impl mevcut değil
pratik deshai

Oda şeması konumunu dereceli olarak verdiniz mi?
Debanjan

1
@pratikdeshai Bu soruna bir çözüm buldunuz mu? Aynı sorunu yaşıyorum.
Krunal

Benim durumumda düzeltmek için kotlin eklentisini kaldırdım. eklenti uygula: 'kotlin-kapt'
Napolean

Yanıtlar:


304

İle çalışan kişiler için KOTLIN , değiştirmeyi deneyin annotationProcessoriçin kaptuygulamalardabuild.gradle

Örneğin:

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

ayrıca bu eklentiyi eklemeyi unutmayın

apply plugin: 'kotlin-kapt'

uygulama düzeyi build.gradle dosyasının en üstüne gidin ve bir temizleme ve yeniden oluşturma yapın ( https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6 uyarınca )

Android Studio'da, kodu yapıştırdığınızda veya oluşturma işlemi sırasında hatalarla karşılaşırsanız, Oluştur> Projeyi Temizle'yi seçin. Ardından Oluştur> Projeyi Yeniden Oluştur'u seçin ve tekrar oluşturun.


GÜNCELLEME

Androidx'e taşındıysanız

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
Çok teşekkürler. Sadece Kotlin'e taşındım ve tüm test davalarım başarısız oldu. Kafamı vuruyordum. Sonra yanlışlıkla bu yorumu gördüm. Günümü kurtardım.
Ozeetee

77
Ayrıca apply plugin: 'kotlin-kapt'uygulama seviyesi build.gradledosyasının en üstüne eklemeniz gerekir
daka

1
Bu beni kurtardı .... Ben Google düzgün hata gösteren daha fazla çalışması gerektiğini düşünüyorum ... Ben kapt çağrı vardı ama ben kapt-eklentisi uygulamak eklemedim
anoop4real

Dünden beri sıkışmıştı. çok teşekkürler. Google kullanıcılarının dokümantasyonda neden bundan bahsetmediğini anlamıyorum.
Shubham Anand

GOAT beni bu hızlı
kepçe

82

Sadece kullan

apply plugin: 'kotlin-kapt'

in app build.gradle

Ve ikisini de bağımlılık içinde tut

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

DÜZENLE

Yeni sürümde her iki bağımlılığı bir seferde eklemenize gerek yok Sadece kullanın, umarım işe yarayacaktır.

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

22

Kaçırdığım zaman bu hatayı aldım

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

Yukarıdaki ek açıklamada belirtilen varlık modelinin belirli model sınıfına atıfta bulunduğundan ve ayrıca gerekli ek açıklamadan emin olun:

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

düzgün bir şekilde tanımlanmış ve iyi olursunuz


1
Anlaşılır olması için bu, DB sınıfı tanımının hemen üstüne çıkar. Sorunumu çözmüş görünüyor - teşekkürler!
winwaed

19

veritabanı uygulamak için kotlin sınıfları kullanıyorsanız

apply plugin: 'kotlin-kapt'

ve

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

gradle dosyanızda çalışır.


Bu Android Studio
3.5'te

İnsanların çoğunun tüm projede androidx kütüphanesi kullanmadığını düşünüyorum.
navalkishoreb

11

Sadece bağımlılıklarınızı güncellemekle ilgili değil. Tüm Oda bağımlılıklarınızın aynı sürüme sahip olduğundan emin olun.

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"

Yukarıdaki örnek snippet'te, tüm Oda bağımlılıklarım aynı sürüme sahip 1.1.0-alpha2


11

Kotlin Geliştiricileri İçin

Bunu kullan:

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

Ve apply plugin: 'kotlin-kapt'uygulama seviyesinin en üstüne ekleyin build.gradle.

Java Geliştiricileri için

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

Farklı cevaplar!
Pedro Massango

Bu nasıl farklı dostum?
Patrick Prakash

7

Bu problemle tanıştım çünkü uygun bağımlılıkları unuttum

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 ekledikten ve yeniden oluşturduktan sonra sorun çözüldü.


7

Sorunla karşılaşıyorum, çünkü @Daoek açıklamaları unuttum

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

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

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

Oda Resmi eğitimi


Ben de unuttum. Teşekkür ederim :) Ama yine de crashh :(
coinhndp

1
Kapt ekleyerek düzeltme
coinhndp

7

build.gradle içindeki oda için doğru bağımlılığı eklediğinizden emin olun

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"

Üstteki çizginin altında

apply plugin: 'kotlin-kapt'

5

Soru oldukça eski, ama bugün bunun üzerinde tökezledim ve verilen cevapların hiçbiri bana yardımcı olmadı. Son olarak, Google dokümantasyonunun Kotlin'e değil, Java'ya hala kabul edildiğini fark ederek çözmeyi başardım , aslında görmezden geldiğim bir yorum eklediler

Kotlin için ek açıklama yerine kapt kullanın

Yani, yerine

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

Kotlin ile gelişiyorsanız şunları kullanmalısınız:

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

4

Aynı sorun vardı. Android Studio tarafından oluşturulan yeni bir örnek projede resmi olarak söylendiği gibi birkaç sınıf ve arayüzü uyguladı: https://developer.android.com/training/data-storage/room/

Yukarıda belirtilen tüm çözümler yardımcı olmadı, veritabanı sınıfına göre gerekli _Impl dosyaları Room tarafından oluşturulmadı. Sonunda terminalde kepçe temizliği yapmak bana çözüme götüren ipucu verdi:

"uyarı: Şema dışa aktarma dizini ek açıklama işlemcisine sağlanmadığından şemayı dışa room.schemaLocationaktaramıyoruz. Ek açıklama işlemci bağımsız değişkeni sağlayabilir VEYA exportSchema öğesini false olarak ayarlayabilirsiniz."

Veritabanı sınıfında exportSchema = false parametresini ekledim

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

Ve sonra çalıştı, bu iki oluşturulan dosyaları oluşturulanJava altında uygulama modülünde bulundu:

  • AppDatabase_Impl
  • UserDao_Impl

Parametrenin isteğe bağlı olduğu söylendiği için bu davranışı anlamıyorum, bkz. Https://stackoverflow.com/a/44645943/3258117


1
Terminalde ./gradlew temiz yapı çalıştırmak anahtar oldu. Benim için şu mesajı aldım: app: 'annotationProcessor' bağımlılıkları kapt ek açıklama işlemcileri olarak tanınmayacak. Bu yapılandırmalar için lütfen yapılandırma adını 'kapt' olarak değiştirin: 'android.arch.lifecycle: compiler: 1.1.1' ve kapt eklentisini uygulayın: "uygula: 'kotlin-kapt'".
Randy

Ah evet, terminaldeki görevleri yerine getirmek de geçmişte bana çok yardımcı oldu. Yapı IDE'deki mesajlar genellikle orijinal hata mesajını "gizler"
Hajo

3

Aşağıdaki not bağlantısını kullanın:

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

Farklı singloton sınıfı oluşturmanız ve Appdatabase'i şu şekilde almanız gerekir:

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
}

yapıcı oluşturmadı, ben doğrudan statik örneği üzerinden kullanıyorum.
pratik deshai

Oda Veritabanı için buradan kontrol edebileceğiniz bir Örnek Proje oluşturdum: github.com/burhanrashid52/Android-Room seçenekleri
Burhanuddin Rashid

2
evet ben güncelleme ama aynı hatayı eşik, AppDatabase_Impl mevcut değil
pratik deshai

@pratikdeshai: Bu hatayı düzelttiniz mi ?? Ben de aynı hatayı alıyorum, bu nedenle takılıp.
Jayesh

2

Benim durumumda, oda veritabanı için bağlantıyı test ediyordum ve test sınıfını AndroidTest klasörü içinde oluşturduğum dizinin içine koydum. Özel dizinden çıkardım, sonra oldukça iyi çalıştı.


Bu da benim sorunum. Bunun neden olduğu ve bundan nasıl kaçınılacağı hakkında bir fikriniz var mı? TestDatabaseSürüm kodunda bir olmamasını tercih ederim .
Eduardo

2

Aynı fenomen bana da oldu.

takip etme

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

Eklemek başka bir derleme hatasına neden olur, ancak nedenini günlükten izler.

Benim durumumda, SQL uygulamasında bir hata oluştu. Düzeltme işleminden sonra derleme başarılı oldu.

Bu nedenle, çökmüş yerlilere bakmak yerine tüm oda kütüphanesinin uygulanmasını kontrol etmek isteyebilirsiniz.


1

Sorun daha fazla gradle derlemesine dahil edilmeyen doğru kitaplık etrafında. Benzer bir sorunum vardı ve eksik olanı ekledim

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


1

Gradle dosyamdaki bağımlılıkları değiştirmek hatayı düzeltmeme yardımcı olmadı. Oda veritabanının başlatıldığı ve bu soruna neden olan sınıfta bu Veritabanı ek notunu kaçırmıştım.

@Database (varlıklar = [UserModel :: class], sürüm = 1)

Yukarıdaki ek açıklamada belirtilen varlık modelinin belirli model sınıfıyla ilgili olduğundan emin olun


kaçırdığım şey bu
pjwin

0

Benim için, Android Studio, Oda veritabanı ile ilgili ithalatlardan herhangi birini eklediğiniz anda bağımlılıkları otomatik olarak güncelledi. Ancak https://developer.android.com/jetpack/androidx/releases/room#declaring_dependencies uyarınca birkaçını güncellemeniz gerekir. Benim kod tabanı şöyle görünür:

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 öğesini yanıtlardan birinde belirtildiği şekilde güncelleyin:

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'ı senkronize edin ve gitmek için iyi olmalısınız.


0

Buradaki örneği okuma: Oda Örneği

Aşağıdaki gibi sadece doğru (sanırım) annotationProcessorFile kullanarak bu hatayı düzeltti:

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

Ayrıca, Yaşam Sürümü sürümünde olduğu gibi Oda Sürümü'nde de 2.2.0'a geçtim.

Kademeyi senkronize ettikten sonra, Room ile çalışmaya başlayabilirim.

İyi şanslar! Ve kod seninle olsun!


0

Kotlin uygulamamda, build.gradle dosyamın üstüne şu satırı ekledim:

apply plugin: 'kotlin-kapt'

Ve bağımlılıklar bölümünde aşağıdaki satır:

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

Umarım sorununuzu düzeltir.


0

OP durumunda değil, ancak açıklama eki yerine yanlışlıkla uygulamayı kullandığınızda da olur böyle:

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

Bunun yerine:

annotationProcessor "android.arch.persistence.room:compiler:x.x.x"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.