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

    }   

}

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"

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'

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


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.


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


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"

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.


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


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'

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"

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


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
}

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.


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.


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


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


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.


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!


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.


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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.