Phòng Android liên tục: AppDatabase_Impl không tồn tại


147

Lớp cơ sở dữ liệu ứng dụng của tôi

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

Học sinh lớp:

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

Và khi tôi hỏi ví dụ, nó sẽ báo lỗi này, AppDatabase_Impl không tồn tại trong lớp ứng dụng của tôi

public class APp extends Application {

    private boolean appRunning = false;

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

    }   

}

Bạn có thể cung cấp các lỗi logcat thích hợp, bạn đang nhận được?
Debanjan

1
Nguyên nhân do: java.lang.R.78Exception: không thể tìm thấy triển khai cho AppDatabase. AppDatabase_Impl không tồn tại
pratik deshai

Bạn đã cung cấp vị trí lược đồ phòng trong lớp?
Debanjan

1
@pratikdeshai Bạn có giải pháp nào cho vấn đề này không? Tôi cũng gặp vấn đề tương tự.
Krunal

Trong trường hợp của tôi, tôi đã gỡ bỏ plugin kotlin để sửa nó. áp dụng plugin: 'kotlin-kapt'
Napolean

Câu trả lời:


303

Đối với những người làm việc với Kotlin , hãy thử thay đổi annotationProcessorđể kapttrong các ứng dụngbuild.gradle

ví dụ:

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

cũng nhớ thêm plugin này

apply plugin: 'kotlin-kapt'

lên đầu tệp xây dựng cấp độ ứng dụng và làm sạch và xây dựng lại (theo https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6 )

Trong Android Studio, nếu bạn gặp lỗi khi dán mã hoặc trong quá trình xây dựng, hãy chọn Build> Clean Project. Sau đó chọn Build> Rebuild Project, rồi xây dựng lại.


CẬP NHẬT

Nếu bạn đã di chuyển sang 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
Cảm ơn rất nhiều. Chỉ cần chuyển đến Kotlin và tất cả các trường hợp thử nghiệm của tôi bắt đầu thất bại. Đang đập đầu tôi. Sau đó, tôi vô tình nhìn thấy bình luận này. Cứu ngày của tôi.
Ozeetee

77
Cũng cần thêm apply plugin: 'kotlin-kapt'vào đầu build.gradletệp cấp ứng dụng
daka

1
Điều này đã cứu tôi .... Tôi nghĩ rằng Google nên làm việc nhiều hơn để hiển thị lỗi thích hợp ... Tôi đã có cuộc gọi kapt nhưng tôi đã không thêm ứng dụng kapt-plugin
anoop4real

Đã bị mắc kẹt kể từ ngày hôm qua. cảm ơn rất nhiều. Tôi không hiểu tại sao mọi người không đề cập đến google trong tài liệu này.
Shubham Anand

Bạn là GOAT đã cứu tôi với bản sửa lỗi lớp nhanh đó
Fanadez

82

Chỉ dùng

apply plugin: 'kotlin-kapt'

trong ứng dụng build.gradle

Và giữ cả hai trong sự phụ thuộc

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

BIÊN TẬP

Trong phiên bản mới hơn, không cần thêm cả hai phụ thuộc cùng một lúc Chỉ cần sử dụng, hy vọng nó sẽ hoạt động.

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

22

Tôi đã có lỗi này khi tôi bỏ lỡ

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

Đảm bảo rằng mô hình thực thể được chỉ định trong chú thích ở trên đề cập đến lớp mô hình cụ thể và cũng đảm bảo rằng chú thích cần thiết:

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

được xác định đúng và bạn sẽ tốt


1
Để rõ ràng, điều này ngay lập tức trên định nghĩa lớp DB. Có vẻ như đã khắc phục vấn đề của tôi - cảm ơn!
thắng

19

nếu bạn đang sử dụng các lớp kotlin để thực hiện cơ sở dữ liệu thì hãy sử dụng

apply plugin: 'kotlin-kapt'

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

trong tập tin lớp của bạn, nó sẽ làm việc.


Điều này hoạt động trên Android Studio 3.5 (tuy nhiên phiên bản trình biên dịch phòng hiện tại là 2.1.0)
Yennefer

Tôi nghĩ rằng hầu hết mọi người không sử dụng thư viện androidx trong toàn bộ dự án ... đó là lý do tại sao tôi đề xuất 1.1.1 ... Bản thân tôi đã phải đối mặt với các vấn đề biên dịch và cảm thấy an toàn với những thay đổi tối thiểu khi sử dụng phiên bản cũ hơn.
navalkishoreb

11

Nó không chỉ là về việc cập nhật phụ thuộc của bạn. Đảm bảo tất cả các phụ thuộc Phòng của bạn có cùng phiên bản.

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"

Trong đoạn mã mẫu ở trên, tất cả các phụ thuộc Phòng của tôi có cùng một phiên bản 1.1.0-alpha2


11

Dành cho nhà phát triển Kotlin

Dùng cái này:

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

Và thêm apply plugin: 'kotlin-kapt'vào đầu cấp độ ứng dụng build.gradle.

Dành cho nhà phát triển Java

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

Câu trả lời khác nhau!
Pedro Massango

Làm thế nào đây là anh chàng khác nhau?
Patrick Prakash

7

Tôi đã gặp vấn đề này bởi vì tôi đã quên sự phụ thuộc 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"

sau khi thêm annotationProcessor và xây dựng lại nó, vấn đề đã được giải quyết.


7

Tôi gặp vấn đề, vì tôi quên @Daochú thích

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

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

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

Phòng chính thức hướng dẫn


Tôi cũng quên nó Cảm ơn bạn :) Nhưng vẫn gặp sự cố :(
coinhndp

1
Khắc phục bằng cách thêm kapt
coinhndp

7

đảm bảo thêm phụ thuộc chính xác cho phòng trong 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"

Và dòng dưới đây ở trên cùng-

apply plugin: 'kotlin-kapt'

5

Câu hỏi khá cũ, nhưng tôi đã vấp phải điều này ngày hôm nay và không có câu trả lời nào được cung cấp giúp tôi. Cuối cùng tôi đã xoay sở để giải quyết nó bằng cách nhận thấy rằng tài liệu google thực sự vẫn được chấp nhận cho Java và không phải là Kotlin theo mặc định, thực sự họ đã thêm một nhận xét mà tôi đã bỏ qua

Đối với Kotlin, sử dụng kapt thay vì annotationProcessor

Vì vậy, thay vì

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

Nếu bạn đang phát triển với Kotlin, bạn nên sử dụng:

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

4

Có cùng một vấn đề. Đã triển khai một vài lớp và giao diện như được nói chính thức trong một dự án ví dụ mới được tạo bởi Android Studio: https://developer.android.com/training/data-st Storage / room /

Tất cả các giải pháp được đề cập ở trên không giúp ích được gì, các tệp _Impl cần thiết theo lớp cơ sở dữ liệu của tôi không được tạo bởi Room. Cuối cùng, việc thực hiện xây dựng lớp sạch trong thiết bị đầu cuối đã cho tôi gợi ý dẫn đến giải pháp:

"cảnh báo: Thư mục xuất lược đồ không được cung cấp cho bộ xử lý chú thích để chúng tôi không thể xuất lược đồ. Bạn có thể cung cấp room.schemaLocationđối số bộ xử lý chú thích HOẶC đặt exportSchema thành false."

Tôi đã thêm tham số exportSchema = false trong lớp cơ sở dữ liệu

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

Và sau đó nó hoạt động, tìm thấy hai tệp được tạo này trong mô-đun ứng dụng trong tệp createdJava:

  • AppDatabase_Impl
  • Người dùngDao_Impl

Tôi không hiểu hành vi này vì tham số được cho là tùy chọn, xem https://stackoverflow.com/a/44645943/3258117


1
Chạy ./gradlew xây dựng sạch từ thiết bị đầu cuối là chìa khóa. Đối với tôi, tôi nhận được thông báo này: app: 'annotationProcessor' phụ thuộc sẽ không được công nhận là bộ xử lý chú thích kapt. Vui lòng thay đổi tên cấu hình thành 'kapt' cho các tạo phẩm này: 'android.arch.lifecycle: trình biên dịch: 1.1.1' và áp dụng plugin kapt: "áp dụng plugin: 'kotlin-kapt'".
Randy

À đúng rồi, thực hiện các nhiệm vụ trong thiết bị đầu cuối cũng giúp tôi rất nhiều trong quá khứ. Các thông báo công cụ xây dựng trong IDE thường "ẩn" thông báo lỗi ban đầu
Hajo

3

Sử dụng liên kết lớp sau:

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

Bạn cần tạo lớp singloton diffretn và lấy Appdatabase từ đó như sau:

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
}

tôi đã không tạo constructor, tôi đang sử dụng trực tiếp thông qua thể hiện tĩnh.
pratik deshai

Tôi đã tạo Dự án mẫu cho Cơ sở dữ liệu phòng, bạn có thể kiểm tra tại đây: github.com/burhanrashid52/Android-Room-Data-Persistent
Burhanuddin Rashid

2
vâng tôi đã cập nhật nhưng lỗi tương tự, AppDatabase_Impl không tồn tại
pratik deshai

@pratikdeshai: Bạn đã sửa lỗi đó chưa ?? Tôi cũng nhận được lỗi tương tự, bị mắc kẹt vì điều này.
Jayesh

2

Trong trường hợp của tôi, tôi đã kiểm tra kết nối cho cơ sở dữ liệu phòng và tôi đã đặt lớp kiểm tra bên trong thư mục mà tôi đã tạo trong thư mục AndroidTest. Tôi đã chuyển nó ra khỏi thư mục tùy chỉnh, sau đó nó hoạt động khá tốt.


Đây là vấn đề của tôi quá. Bất cứ ý tưởng tại sao điều này đang xảy ra và làm thế nào để tránh điều này? Tôi thà không có TestDatabasemã phát hành.
Eduardo

2

Hiện tượng tương tự xảy ra với tôi.

tiếp theo

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

Thêm nguyên nhân gây ra lỗi xây dựng khác nhưng theo dõi nguyên nhân từ nhật ký.

Trong trường hợp của tôi, đã xảy ra lỗi khi triển khai SQL. Sau khi sửa chữa, việc xây dựng đã thành công.

Vì vậy, bạn có thể muốn kiểm tra việc thực hiện toàn bộ thư viện phòng thay vì nhìn vào người dân địa phương bị rơi.


1

Vấn đề là nhiều hơn xung quanh thư viện chính xác không được bao gồm trong bản dựng lớp. Tôi đã có một vấn đề tương tự và thêm mất tích

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


1

Việc thay đổi các phụ thuộc trong tệp lớp của tôi không giúp tôi sửa lỗi. Tôi đã bỏ lỡ chú thích cơ sở dữ liệu này trong lớp nơi cơ sở dữ liệu phòng được khởi tạo gây ra sự cố này.

@Database (thực thể = [UserModel :: class], phiên bản = 1)

Đảm bảo rằng mô hình thực thể được chỉ định trong chú thích ở trên tham chiếu đến lớp mô hình cụ thể


đây là những gì tôi đã bỏ lỡ
pjwin

0

Đối với tôi, Android Studio tự động cập nhật các phụ thuộc ngay khi bạn đưa vào bất kỳ nhập khẩu nào liên quan đến cơ sở dữ liệu Phòng. Nhưng theo https://developer.android.com/jetpack/androidx/release/room#declaring_dependencies bạn cần cập nhật vài. Đây là cách cơ sở mã của tôi trông như thế nào:

Ứng dụng cơ sở dữ liệu.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()
    }
}

Cập nhật build.gradle như được chỉ định trong một trong các câu trả lời:

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"

}

Đồng bộ hóa lớp và bạn nên đi.


0

Đọc ví dụ ở đây: Ví dụ về phòng

Tôi đã sửa lỗi này chỉ bằng cách sử dụng annotationProcessorFile chính xác (như tôi đoán), như sau:

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

Ngoài ra, tôi đã nâng cấp lên 2.2.0 trong Phiên bản phòng như trong phiên bản Vòng đời.

Sau khi đồng bộ hóa, tôi có thể bắt đầu làm việc với Room.

Vậy thì chúc may mắn! Và hãy để mã được với bạn!


0

Trong ứng dụng kotlin của tôi, tôi chỉ cần thêm dòng sau vào đầu tệp build.gradle của mình:

apply plugin: 'kotlin-kapt'

Và dòng sau trong phần phụ thuộc:

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

Tôi hy vọng nó khắc phục vấn đề của bạn.


0

Không phải trong trường hợp của OP, nhưng điều này cũng xảy ra khi bạn sử dụng sai cách thực hiện thay vì annotationProcessor như thế này:

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

Thay vì điều này:

annotationProcessor "android.arch.persistence.room:compiler:x.x.x"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.