Kamar Android gigih: AppDatabase_Impl tidak ada

147

Kelas basis data aplikasi saya

@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 Gradle:

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

Dan ketika saya meminta misalnya itu akan memberikan kesalahan ini, AppDatabase_Impl tidak ada di kelas aplikasi saya

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
sumber
Bisakah Anda memberikan kesalahan logcat yang tepat, Anda dapatkan?
Debanjan
1
Disebabkan oleh: java.lang.RuntimeException: tidak dapat menemukan implementasi untuk AppDatabase. AppDatabase_Impl tidak ada
pratik deshai
Sudahkah Anda memberikan lokasi skema kamar dalam gradle?
Debanjan
1
@pratikdeshai Apakah Anda mendapatkan solusi untuk masalah ini? Saya juga mengalami masalah yang sama.
Krunal
Dalam kasus saya, saya menghapus plugin kotlin untuk memperbaikinya. terapkan plugin: 'kotlin-kapt'
Napolean

Jawaban:

303

Bagi yang bekerja dengan Kotlin , coba ganti annotationProcessorke kaptdalam aplikasibuild.gradle

sebagai contoh:

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

ingat juga untuk menambahkan plugin ini

apply plugin: 'kotlin-kapt'

ke bagian atas file build.gradle tingkat aplikasi dan lakukan pembersihan dan rekondisi (menurut https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6 )

Di Android Studio, jika Anda mendapatkan kesalahan saat Anda menempelkan kode atau selama proses pembuatan, pilih Build> Clean Project. Kemudian pilih Build> Rebuild Project, dan kemudian bangun lagi.


MEMPERBARUI

Jika Anda telah bermigrasi ke 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
sumber
2
Terima kasih banyak. Hanya pindah ke Kotlin dan semua kotak uji saya mulai gagal. Memukul kepalaku. Kemudian saya tidak sengaja melihat komentar ini. Menyelamatkan hariku.
Ozeetee
77
Juga perlu menambahkan apply plugin: 'kotlin-kapt'ke atas build.gradlefile tingkat aplikasi
daka
1
Ini menyelamatkan saya .... Saya pikir Google harus bekerja lebih banyak untuk menunjukkan kesalahan yang tepat ... Saya punya panggilan kapt tapi saya tidak menambahkan berlaku kapt-plugin
anoop4real
Terjebak sejak kemarin. Terima kasih banyak. Saya tidak mengerti mengapa tidak orang Google menyebutkan ini dalam dokumentasi.
Shubham Anand
Kau the GOAT menyelamatkan saya dengan perbaikan gradle cepat
Fanadez
82

Gunakan saja

apply plugin: 'kotlin-kapt'

di app build.gradle

Dan menjaga keduanya dalam dependensi

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

EDIT

Dalam versi yang lebih baru tidak perlu menambahkan kedua dependensi sekaligus. Cukup gunakan, harap ini akan berfungsi.

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

Saya memiliki kesalahan ini ketika saya gagal

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

Pastikan bahwa model entitas yang ditentukan dalam anotasi di atas mengacu pada kelas model tertentu dan juga memastikan bahwa anotasi yang diperlukan:

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

didefinisikan dengan benar dan Anda akan menjadi baik

Thadeus Ajayi
sumber
1
Untuk kejelasan, ini langsung di atas definisi kelas DB. Tampaknya telah memperbaiki masalah saya - terima kasih!
Menang
19

jika Anda menggunakan kelas kotlin untuk mengimplementasikan basis data maka gunakan

apply plugin: 'kotlin-kapt'

dan

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

dalam file gradle Anda, itu akan berfungsi.

navalkishoreb
sumber
Ini bekerja pada Android Studio 3.5 (namun versi kompiler kamar saat ini 2.1.0)
Yennefer
Saya pikir sebagian besar orang tidak menggunakan perpustakaan androidx di seluruh proyek ... itu sebabnya saya menyarankan 1.1.1 ... Saya sendiri menghadapi masalah kompilasi dan merasa aman dengan perubahan minimal menggunakan versi yang lebih lama.
navalkishoreb
11

Ini bukan hanya tentang memperbarui dependensi Anda. Pastikan semua dependensi Kamar Anda memiliki versi yang sama.

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"

Dalam cuplikan sampel di atas, semua dependensi Kamar saya memiliki versi yang sama 1.1.0-alpha2

Idee
sumber
11

Untuk Pengembang Kotlin

Gunakan ini:

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

Dan tambahkan apply plugin: 'kotlin-kapt'ke bagian atas tingkat aplikasi build.gradle.

Untuk Pengembang Java

implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
Pedro Massango
sumber
Jawaban berbeda!
Pedro Massango
Kenapa ini berbeda dude?
Patrick Prakash
7

Saya menemui masalah ini karena saya lupa ketergantungan yang tepat

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"

setelah menambahkan annotationProcessor, dan membangunnya kembali, masalah terpecahkan.

ahsiu
sumber
7

Saya menemui masalah, karena saya lupa @Daoanotasi

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

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

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

Ruangan tutorial Resmi

shellhub
sumber
Saya juga lupa. Terima kasih :) Tapi masih crashh :(
coinhndp
1
Perbaiki dengan menambahkan kapt
coinhndp
7

pastikan untuk menambahkan ketergantungan yang benar untuk kamar di 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"

Dan di bawah garis di atas-

apply plugin: 'kotlin-kapt'
Deepak
sumber
5

Pertanyaannya cukup lama, tetapi saya menemukan ini hari ini dan tidak ada jawaban yang membantu saya. Akhirnya saya berhasil menyelesaikannya dengan memperhatikan bahwa dokumentasi google sebenarnya masih diadopsi ke Jawa dan bukan Kotlin secara default, sebenarnya mereka telah menambahkan komentar yang saya abaikan.

Untuk Kotlin gunakan kapt bukan anotationProcessor

Jadi, bukannya

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

Jika Anda mengembangkan dengan Kotlin, Anda harus menggunakan:

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

Punya masalah yang sama. Menerapkan beberapa kelas dan antarmuka seperti yang secara resmi diceritakan dalam proyek contoh baru yang dibuat oleh Android Studio: https://developer.android.com/training/data-storage/room/

Semua solusi yang disebutkan di atas tidak membantu, file _Impl yang diperlukan sesuai dengan kelas database saya tidak dihasilkan oleh Room. Akhirnya menjalankan terminal build build gradle clean memberi saya petunjuk yang mengarah ke solusi:

"peringatan: Direktori ekspor skema tidak disediakan untuk prosesor anotasi sehingga kami tidak dapat mengekspor skema. Anda bisa memberikan room.schemaLocationargumen prosesor penjelasan atau ATAU mengatur exportSchema ke false."

Saya menambahkan parameter exportSchema = false di kelas database

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

Dan kemudian berhasil, menemukan dua file yang dihasilkan ini dalam modul aplikasi di bawah generateJava:

  • AppDatabase_Impl
  • UserDao_Impl

Saya tidak mengerti perilaku ini karena parameternya dikatakan opsional, lihat https://stackoverflow.com/a/44645943/3258117

Hajo
sumber
1
Menjalankan ./gradlew clean build dari terminal adalah kuncinya. Bagi saya, saya mendapatkan pesan ini: dependensi 'annotationProcessor' app: tidak akan dikenali sebagai prosesor penjelasan anotasi. Silakan ubah nama konfigurasi menjadi 'kapt' untuk artefak ini: 'android.arch.lifecycle: compiler: 1.1.1' dan terapkan plugin kapt: "apply plugin: 'kotlin-kapt'".
Randy
Ah ya, menjalankan tugas di terminal juga banyak membantu saya di masa lalu. Pesan alat bangun di IDE sering "menyembunyikan" pesan kesalahan asli
Hajo
3

Gunakan tautan gradle berikut:

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

Anda perlu membuat kelas singloton diffretn dan mendapatkan Appdatabase dari sana seperti ini:

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
sumber
saya tidak membuat konstruktor, saya menggunakan langsung via instance statis.
pratik deshai
Saya telah membuat Proyek Sampel untuk Basis Data Kamar, Anda dapat memeriksanya di sini: github.com/burhanrashid52/Android-Room-Data-Persistent
Burhanuddin Rashid
2
ya saya memperbarui tetapi masih ada kesalahan yang sama, AppDatabase_Impl tidak ada
pratik deshai
@pratikdeshai: Sudahkah Anda memperbaiki kesalahan itu ?? Saya juga mendapatkan kesalahan yang sama, macet karena ini.
Jayesh
2

Dalam kasus saya, saya sedang menguji konektivitas untuk database kamar dan saya telah menempatkan kelas pengujian di dalam direktori yang telah saya buat di dalam folder AndroidTest. Saya telah memindahkannya dari direktori kustom, kemudian bekerja dengan cukup baik.

Farruh Habibullaev
sumber
Ini juga masalah saya. Adakah yang tahu mengapa ini terjadi dan bagaimana cara menghindarinya? Saya lebih suka tidak memiliki TestDatabasekode rilis.
Eduardo
2

Fenomena yang sama terjadi pada saya.

berikut

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

Menambahkan menyebabkan kesalahan build lain tetapi melacak penyebab dari log.

Dalam kasus saya, ada kesalahan dalam implementasi SQL. Setelah diperbaiki, build berhasil.

Jadi, Anda mungkin ingin memeriksa implementasi perpustakaan seluruh ruangan daripada melihat penduduk setempat yang jatuh.

pengguna11221761
sumber
1

Masalahnya lebih pada pustaka yang benar yang tidak termasuk dalam gradle build. Saya memiliki masalah yang sama dan menambahkan yang hilang

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

Saurabh Sharma
sumber
1

Mengubah dependensi dalam file gradle saya tidak membantu saya dalam memperbaiki kesalahan. Saya telah melewatkan anotasi Database ini di kelas tempat database Room diinisialisasi yang menyebabkan masalah ini.

@ Database (entitas = [UserModel :: class], versi = 1)

Pastikan bahwa model entitas yang ditentukan dalam anotasi di atas mengacu pada kelas model tertentu

Wajhia Maqsood
sumber
ini yang saya lewatkan
pjwin
0

Bagi saya, Android Studio secara otomatis memperbarui dependensi segera setelah Anda memasukkan salah satu impor terkait basis data Kamar. Tetapi sesuai https://developer.android.com/jetpack/androidx/releases/room#declaring_dependencies Anda perlu memperbarui beberapa. Begini tampilannya basis kode saya:

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

Perbarui build.gradle sebagaimana ditentukan dalam salah satu jawaban:

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"

}

Sinkronkan gradle dan Anda harus melakukannya dengan baik.

Rujoota Shah
sumber
0

Baca contohnya di sini: Contoh Kamar

Saya memperbaiki kesalahan ini hanya menggunakan annotationProcessorFile yang benar (saya kira itu), sebagai berikut:

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

Juga, saya memutakhirkan ke 2.2.0 baik di Versi Kamar seperti di versi Siklus Hidup.

Setelah menyinkronkan graddle, saya bisa mulai bekerja dengan Room.

Jadi, Semoga Sukses! Dan biarkan kodenya menyertai Anda!

Anibal Itriago
sumber
0

Di aplikasi kotlin saya, saya baru saja menambahkan baris berikut di bagian atas file build.gradle saya:

apply plugin: 'kotlin-kapt'

Dan baris berikut di bagian dependensi:

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

Saya harap ini memperbaiki masalah Anda.

ZakariaBK
sumber
0

Tidak dalam kasus OP, tetapi ini juga terjadi ketika Anda salah menggunakannya implementasi, bukan anotasiProcessor seperti ini:

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

Alih-alih ini:

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