ห้อง Android ถาวร: AppDatabase_Impl ไม่มีอยู่


148

คลาสฐานข้อมูลแอปของฉัน

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

และเมื่อฉันถามอินสแตนซ์มันจะให้ข้อผิดพลาดนี้ AppDatabase_Impl ไม่มีอยู่ในแอปพลิเคชันของฉัน

public class APp extends Application {

    private boolean appRunning = false;

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

    }   

}

คุณสามารถให้ข้อผิดพลาด logcat ที่เหมาะสมคุณได้รับ?
Debanjan

1
เกิดจาก: java.lang.RuntimeException: ไม่พบการปรับใช้สำหรับ AppDatabase AppDatabase_Impl ไม่มีอยู่
pratik deshai

คุณได้ระบุตำแหน่งสคีมาของห้องพักแบบ gradle หรือไม่
Debanjan

1
@pratikdeshai คุณได้รับการแก้ไขปัญหานี้หรือไม่? ฉันยังมีปัญหาเดียวกัน
Krunal

ในกรณีของฉันฉันลบปลั๊กอิน kotlin เพื่อแก้ไข ใช้ปลั๊กอิน: 'kotlin-kapt'
นโปเลียน

คำตอบ:


304

สำหรับผู้ที่ทำงานกับKotlinลองเปลี่ยนannotationProcessorไปkaptในปพลิเคชันbuild.gradle

ตัวอย่างเช่น:

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

อย่าลืมเพิ่มปลั๊กอินนี้ด้วย

apply plugin: 'kotlin-kapt'

ไปที่ด้านบนของไฟล์ระดับ build.gradle ของแอพและทำการล้างข้อมูลและสร้างใหม่ (ตามhttps://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6 )

ใน Android Studio หากคุณได้รับข้อผิดพลาดเมื่อคุณวางรหัสหรือในระหว่างกระบวนการสร้างเลือกสร้าง> ล้างโครงการ จากนั้นเลือกสร้าง> สร้างโครงการใหม่แล้วสร้างใหม่อีกครั้ง


UPDATE

หากคุณย้ายไปยัง 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
ขอบคุณมาก. เพียงแค่ย้ายไปที่ Kotlin และกรณีทดสอบทั้งหมดของฉันเริ่มล้มเหลว ถูกกระแทกหัวของฉัน จากนั้นฉันเห็นความคิดเห็นนี้โดยไม่ตั้งใจ บันทึกวันของฉัน
Ozeetee

77
ต้องเพิ่มapply plugin: 'kotlin-kapt'ไปที่ด้านบนของbuild.gradleไฟล์ระดับแอปด้วย
daka

1
สิ่งนี้ช่วยฉัน .... ฉันคิดว่า Google ควรทำงานมากขึ้นในการแสดงข้อผิดพลาดที่เหมาะสม ... ฉันมี kapt call แต่ฉันไม่ได้เพิ่มใช้ kapt-plugin
anoop4real

ติดขัดตั้งแต่เมื่อวาน ขอบคุณมาก. ฉันไม่เข้าใจว่าทำไมคน google ถึงไม่พูดถึงเรื่องนี้ในเอกสาร
Shubham Anand

คุณคือ GOAT ที่ช่วยฉันในการแก้ปัญหาการไล่ระดับอย่างรวดเร็ว
Fanadez

82

เพียงแค่ใช้

apply plugin: 'kotlin-kapt'

ในแอพ build.gradle

และเก็บทั้งในการพึ่งพา

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

แก้ไข

ในรุ่นที่ใหม่กว่าไม่จำเป็นต้องเพิ่มการพึ่งพาทั้งสองในเวลาเพียงแค่ใช้หวังว่ามันจะทำงาน

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

22

ฉันมีข้อผิดพลาดนี้เมื่อฉันพลาด

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

ตรวจสอบให้แน่ใจว่าโมเดลเอนทิตีที่ระบุในหมายเหตุประกอบด้านบนอ้างถึงคลาสโมเดลเฉพาะและตรวจสอบให้แน่ใจว่าหมายเหตุประกอบที่จำเป็น:

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

มีการกำหนดอย่างถูกต้องและคุณจะดี


1
เพื่อความชัดเจนนี่จะไปเหนือคำจำกัดความของคลาส DB ทันที ดูเหมือนจะแก้ไขปัญหาของฉันได้แล้ว - ขอบคุณ!
winwaed

19

ถ้าคุณใช้คลาส kotlin เพื่อใช้ฐานข้อมูลให้ใช้

apply plugin: 'kotlin-kapt'

และ

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

ในไฟล์ gradle ของคุณมันจะทำงาน


ใช้งานได้กับ Android Studio 3.5 (เวอร์ชั่นคอมไพเลอร์ปัจจุบันคือ 2.1.0)
Yennefer

ฉันคิดว่าคนส่วนใหญ่ไม่ได้ใช้ห้องสมุด androidx ในโครงการทั้งหมด ... นั่นเป็นเหตุผลที่ฉันแนะนำ 1.1.1 ... ตัวฉันเองประสบปัญหาการรวบรวมและรู้สึกปลอดภัยกับการเปลี่ยนแปลงเล็กน้อยโดยใช้เวอร์ชั่นที่เก่ากว่า
navalkishoreb

11

มันไม่ได้เป็นเพียงแค่เกี่ยวกับการปรับปรุงการอ้างอิงของคุณ ตรวจสอบให้แน่ใจว่าห้องที่ขึ้นต่อกันของคุณมีเวอร์ชั่นเดียวกัน

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"

ในตัวอย่างข้อมูลตัวอย่างด้านบนการอ้างอิงห้องของฉันทั้งหมดมีรุ่นเดียวกัน 1.1.0-alpha2


11

สำหรับนักพัฒนา Kotlin

ใช้สิ่งนี้:

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

และเพิ่มapply plugin: 'kotlin-kapt'ไปที่ด้านบนของระดับแอbuild.gradle

สำหรับผู้พัฒนา Java

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

คำตอบที่แตกต่างกัน!
Pedro Massango

ทำไมมันถึงแตกต่างกันนะ?
Patrick Prakash

7

ฉันพบปัญหานี้เพราะฉันลืมการพึ่งพา 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"

หลังจากเพิ่มคำอธิบายประกอบตัวประมวลผลแล้วสร้างใหม่ปัญหาจะได้รับการแก้ไข


7

ฉันพบกับปัญหาเพราะฉันลืม@Daoคำอธิบายประกอบ

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

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

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

ห้องฝึกสอนอย่างเป็นทางการ


ฉันก็ลืมไปเหมือนกัน ขอบคุณ :) แต่ยังคงพังทลาย :(
coinhndp

1
แก้ไขโดยการเพิ่ม kapt
coinhndp

7

ตรวจสอบให้แน่ใจว่าเพิ่มการพึ่งพาที่ถูกต้องสำหรับห้องใน 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"

และด้านล่างบรรทัดที่ด้านบน -

apply plugin: 'kotlin-kapt'

5

คำถามนั้นค่อนข้างเก่า แต่วันนี้ฉันสะดุดแล้วและไม่มีคำตอบใดที่ช่วยฉันได้ ในที่สุดฉันก็จัดการแก้ไขมันโดยการสังเกตว่าเอกสาร Google จริงยังคงถูกนำไปใช้กับ Java และไม่ใช่ Kotlin ตามค่าเริ่มต้นจริง ๆ แล้วพวกเขาได้เพิ่มความคิดเห็นที่ฉันไม่สนใจ

สำหรับ Kotlin ให้ใช้ kapt แทน annotationProcessor

ดังนั้นแทนที่จะ

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

หากคุณกำลังพัฒนาด้วย Kotlin คุณควรใช้:

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

4

มีปัญหาเดียวกัน ใช้คลาสและอินเทอร์เฟซน้อยตามที่ได้รับการบอกกล่าวอย่างเป็นทางการในโครงการตัวอย่างใหม่ที่สร้างโดย Android Studio: https://developer.android.com/training/data-storage/room/

โซลูชันที่กล่าวถึงข้างต้นทั้งหมดไม่ได้ช่วยไฟล์ _Impl ที่จำเป็นตามคลาสฐานข้อมูลของฉันไม่ได้ถูกสร้างโดย Room ในที่สุดการดำเนินการสร้าง clean gradle ใน terminal ให้ฉันคำแนะนำที่นำไปสู่การแก้ปัญหา:

"คำเตือน: ไดเรกทอรีส่งออกของสคีมาไม่ได้ถูกจัดเตรียมไว้ในตัวประมวลผลคำอธิบายประกอบดังนั้นเราจึงไม่สามารถส่งออกสคีมาคุณสามารถระบุได้ room.schemaLocationอาร์กิวเมนต์ตัวประมวลผลคำอธิบายประกอบหรือตั้งค่า exportSchema เป็นเท็จ"

ฉันเพิ่มพารามิเตอร์ exportSchema = false ในคลาสฐานข้อมูล

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

และจากนั้นก็ใช้งานได้พบไฟล์ที่สร้างขึ้นสองไฟล์เหล่านี้ในโมดูลแอพที่สร้างขึ้นจาก Java:

  • AppDatabase_Impl
  • UserDao_Impl

ฉันไม่เข้าใจพฤติกรรมนี้เนื่องจากมีการกล่าวว่าพารามิเตอร์เป็นตัวเลือกโปรดดูที่ https://stackoverflow.com/a/44645943/3258117


1
การเรียกใช้ ./gradlew clean build จากเทอร์มินัลคือกุญแจสำคัญ สำหรับฉันฉันได้รับข้อความนี้: แอป: 'annotationProcessor' การพึ่งพาจะไม่ถูกจดจำเป็นตัวประมวลผลคำอธิบายประกอบ kapt โปรดเปลี่ยนชื่อการกำหนดค่าเป็น 'kapt' สำหรับสิ่งประดิษฐ์เหล่านี้: 'android.arch.lifecycle: คอมไพเลอร์: 1.1.1' และใช้ปลั๊กอิน kapt: "ใช้ปลั๊กอิน: 'kotlin-kapt'"
แรนดี้

อ่าใช่การทำงานในเทอร์มินัลก็ช่วยฉันได้มากในอดีต ข้อความเครื่องมือสร้างใน IDE มักจะ "ซ่อน" ข้อความแสดงข้อผิดพลาดดั้งเดิม
Hajo

3

ใช้ลิงก์ gradle ต่อไปนี้:

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

คุณต้องสร้างคลาส diffretn singloton และรับ Appdatabase จากนั้น:

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
}

ฉันไม่ได้สร้างนวกรรมิกฉันใช้โดยตรงผ่านอินสแตนซ์แบบคงที่
pratik deshai

ฉันได้สร้างตัวอย่างโครงการสำหรับฐานข้อมูลห้องคุณสามารถตรวจสอบได้ที่นี่: github.com/burhanrashid52/Android-Room-Data-Persistent
Burhanuddin Rashid

2
ใช่ฉันอัปเดตแล้ว แต่เกิดข้อผิดพลาดเดียวกัน AppDatabase_Impl ไม่มีอยู่จริง
pratik deshai

@pratikdeshai: คุณแก้ไขข้อผิดพลาดนั้นแล้วหรือยัง? ฉันยังได้รับข้อผิดพลาดเดียวกันติดขัดด้วยเหตุนี้
Jayesh

2

ในกรณีของฉันฉันกำลังทดสอบการเชื่อมต่อสำหรับฐานข้อมูลห้องและฉันได้ใส่ชั้นทดสอบในไดเรกทอรีที่ฉันสร้างขึ้นในโฟลเดอร์ AndroidTest ฉันย้ายมันออกจากไดเรกทอรีที่กำหนดเองแล้วมันใช้งานได้ดี


นี่คือปัญหาของฉันด้วย มีความคิดว่าทำไมสิ่งนี้จึงเกิดขึ้นและจะหลีกเลี่ยงสิ่งนี้ได้อย่างไร? ฉันไม่ต้องการให้มีTestDatabaseรหัสการเปิดตัว
Eduardo

2

ปรากฏการณ์เดียวกันนี้เกิดขึ้นกับฉัน

ดังต่อไปนี้

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

การเพิ่มทำให้เกิดข้อผิดพลาดของบิลด์อื่น แต่ติดตามสาเหตุจากบันทึก

ในกรณีของฉันมีข้อผิดพลาดในการใช้งาน SQL หลังจากแก้ไขแล้วบิลด์ก็สำเร็จ

ดังนั้นคุณอาจต้องการตรวจสอบการใช้งานของห้องสมุดห้องทั้งหมดแทนที่จะมองไปที่คนท้องถิ่นที่พัง


1

ปัญหาอยู่ที่ไลบรารีที่ถูกต้องซึ่งไม่รวมอยู่ในโครงสร้างการไล่ระดับสี ฉันมีปัญหาที่คล้ายกันและเพิ่มสิ่งที่ขาดหายไป

ทดสอบการใช้งาน "android.arch.persistence.room:testing:$room_version


1

การเปลี่ยนการอ้างอิงในไฟล์ gradle ของฉันไม่ได้ช่วยฉันในการแก้ไขข้อผิดพลาดฉันพลาดคำอธิบายประกอบฐานข้อมูลนี้ในชั้นเรียนที่ฐานข้อมูลห้องเริ่มต้นซึ่งทำให้เกิดปัญหานี้

@Database (เอนทิตี = [UserModel :: class], version = 1)

ตรวจสอบให้แน่ใจว่าโมเดลเอนทิตีที่ระบุในคำอธิบายประกอบด้านบนอ้างถึงคลาสโมเดลเฉพาะ


นี่คือสิ่งที่ฉันพลาด
pjwin

0

สำหรับฉันแล้ว Android Studio จะอัปเดตการอ้างอิงโดยอัตโนมัติทันทีที่คุณรวมการนำเข้าใด ๆ ที่เกี่ยวข้องกับฐานข้อมูลห้อง แต่ตามhttps://developer.android.com/jetpack/androidx/releases/room#declaring_dependenciesคุณต้องอัปเดตไม่กี่ นี่คือลักษณะที่รหัสฐานของฉันดูเหมือน:

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 ตามที่ระบุในหนึ่งในคำตอบ:

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"

}

ซิงค์การไล่ระดับสีและคุณควรจะไปดี


0

อ่านตัวอย่างที่นี่: ตัวอย่างห้อง

ฉันแก้ไขข้อผิดพลาดนี้เพียงแค่ใช้ถูกต้อง (ฉันเดาว่ามันเป็น) annotationProcessorFile ดังนี้:

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

นอกจากนี้ฉันอัพเกรดเป็น 2.2.0 ทั้งในเวอร์ชันห้องเช่นเดียวกับในเวอร์ชั่น Lifecycle

ฉันสามารถเริ่มทำงานกับห้องได้

ดังนั้นขอให้โชคดี! และปล่อยให้รหัสอยู่กับคุณ!


0

ในแอป kotlin ของฉันฉันเพิ่งเพิ่มบรรทัดต่อไปนี้ที่ด้านบนของไฟล์ build.gradle ของฉัน:

apply plugin: 'kotlin-kapt'

และบรรทัดต่อไปนี้ในส่วนการอ้างอิง:

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

ฉันหวังว่ามันจะช่วยแก้ปัญหาของคุณ


0

ไม่ใช่ในกรณีของ OP แต่สิ่งนี้จะเกิดขึ้นเมื่อคุณใช้การใช้งานผิดพลาดแทนการใช้คำอธิบายประกอบตัวประมวลผลเช่นนี้:

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

แทนสิ่งนี้:

annotationProcessor "android.arch.persistence.room:compiler:x.x.x"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.