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

ग्रेड लिब:

 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

    }   

}

क्या आप उचित लॉगकैट त्रुटि प्रदान कर सकते हैं, आपको मिल रही है?
देबंजन

1
इसके कारण: java.lang.RuntimeException: AppDatabase के लिए कार्यान्वयन नहीं मिल सकता है। AppDatabase_Impl मौजूद नहीं है
pratik deshai

क्या आपने कमरे को स्कीमा स्थान प्रदान किया है?
देबंजन

1
@pratikdeshai क्या आपको इस मुद्दे का कोई हल मिला? मुझे भी यही समस्या हो रही है।
क्रुणाल

मेरे मामले में मैंने इसे ठीक करने के लिए कोटलिन प्लगइन को हटा दिया। प्लगइन लागू करें: 'kotlin-kapt'
नेपोलियन

जवाबों:


304

कोटलिन के साथ काम करने वालों के लिए , एप्लिकेशन में बदलने annotationProcessorका प्रयास करेंkaptbuild.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'

एप्लिकेशन स्तर बिल्ड .ग्रेड फ़ाइल के शीर्ष पर और एक साफ और पुनर्निर्माण करें ( https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6 के अनुसार )

एंड्रॉइड स्टूडियो में, यदि आपको कोड बनाते समय या बिल्ड प्रक्रिया के दौरान त्रुटियां मिलती हैं, तो बिल्ड> क्लीन प्रोजेक्ट चुनें। फिर Build> Rebuild Project का चयन करें, और फिर फिर से निर्माण करें।


अपडेट करें

अगर आप 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
बहुत बहुत धन्यवाद। बस कोटलिन के लिए आगे बढ़ रहा है और मेरे सभी परीक्षण मामलों में विफल रहा है। मेरा सिर पीट रहा था। फिर मैंने गलती से यह टिप्पणी देखी। मेरा दिन बचाया।
ओजेटी

77
इसके अलावा apply plugin: 'kotlin-kapt'ऐप लेवल build.gradleफ़ाइल के शीर्ष पर जोड़ने की आवश्यकता है
डाका

1
इसने मुझे बचाया .... मुझे लगता है कि Google को उचित त्रुटि दिखाने पर अधिक काम करना चाहिए ... मेरे पास kapt कॉल थी लेकिन मैंने लागू नहीं किया kapt-plugin
anoop4real

कल से अटका हुआ था। बहुत बहुत धन्यवाद। मुझे समझ में नहीं आता है कि Google लोगों ने प्रलेखन में इसका उल्लेख क्यों नहीं किया है।
शुभम आनंद

आप GOAT ने मुझे उस त्वरित
ग्रेड

82

महज प्रयोग करें

apply plugin: 'kotlin-kapt'

एप्लिकेशन बिल्ड में .ग्रेड करें

और दोनों निर्भरता में रहते हैं

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
स्पष्टता के लिए, यह डीबी श्रेणी की परिभाषा से तुरंत ऊपर है। ऐसा लगता है कि मेरी समस्या ठीक हो गई है - धन्यवाद!
जीत लिया

19

यदि आप डेटाबेस को लागू करने के लिए कोटलिन वर्गों का उपयोग कर रहे हैं तो उपयोग करें

apply plugin: 'kotlin-kapt'

तथा

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

आपके ग्रेड फ़ाइल में, यह काम करेगा।


यह एंड्रॉइड स्टूडियो 3.5 पर काम करता है (हालांकि वर्तमान कमरे का संकलक संस्करण 2.1.0 है)
येंफर सेफ़

मुझे लगता है कि अधिकांश लोग पूरे प्रोजेक्ट में androidx लाइब्रेरी का उपयोग नहीं कर रहे थे ... इसलिए मैंने 1.1.1 का सुझाव दिया ... मैंने खुद संकलन मुद्दों का सामना किया और पुराने संस्करण का उपयोग करके न्यूनतम बदलावों के साथ सुरक्षित महसूस किया।
नवलकिशोरब

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

कोटलिन डेवलपर्स के लिए

इसे इस्तेमाल करो:

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

और apply plugin: 'kotlin-kapt'ऐप स्तर के शीर्ष पर जोड़ें build.gradle

जावा डेवलपर्स के लिए

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

अलग जवाब!
पेड्रो मस्संगो

यह कैसे अलग है दोस्त?
पैट्रिक प्रकाश

7

मैं इस समस्या से मिला क्योंकि मैं उपयुक्त निर्भरता को भूल गया हूं

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

कक्ष आधिकारिक ट्यूटोरियल


मैं इसे भी भूल गया। धन्यवाद :) लेकिन अभी भी दुर्घटना :(
सिक्का 12

1
13-24 को 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 प्रलेखन वास्तव में अभी भी जावा को अपनाया गया है और कोटलिन को डिफ़ॉल्ट रूप से नहीं अपनाया गया है, वास्तव में उन्होंने एक टिप्पणी जोड़ी है जिसे मैंने अनदेखा कर दिया है

कोटलिन के लिए एनोटेशनप्रोसेसर के बजाय कैप्ट का उपयोग करें

इसलिए, के बजाय

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

यदि आप कोटलिन के साथ विकसित कर रहे हैं, तो आपको उपयोग करना चाहिए:

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

4

एक ही समस्या थी। एंड्रॉइड स्टूडियो द्वारा बनाई गई एक नई उदाहरण परियोजना में आधिकारिक तौर पर बताई गई कुछ कक्षाओं और इंटरफ़ेस को लागू किया गया: https://developer.android.com/training/data-storage/room/

ऊपर वर्णित सभी समाधानों से मदद नहीं मिली, मेरे डेटाबेस वर्ग के अनुसार आवश्यक _Impl फाइलें कक्ष द्वारा उत्पन्न नहीं की गईं। अंत में टर्मिनल में स्वच्छ ग्रेड निर्माण को अंजाम देते हुए मुझे संकेत दिया कि समाधान के लिए नेतृत्व:

"चेतावनी: स्कीमा निर्यात निर्देशिका एनोटेशन प्रोसेसर को प्रदान नहीं की जाती है, इसलिए हम स्कीमा को निर्यात नहीं कर सकते। आप या तो room.schemaLocationएनोटेशन प्रोसेसर तर्क प्रदान कर सकते हैं या एक्सपोर्टस्चेमा को गलत पर सेट कर सकते हैं ।"

मैंने डेटाबेस क्लास में पैरामीटर ExportSchema = false जोड़ा है

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

और फिर इसने काम किया, इन दो जेनरेट की गई फाइलों को ऐप मॉड्यूल में जनरेट जावा के तहत पाया:

  • AppDatabase_Impl
  • UserDao_Impl

मैं इस व्यवहार को नहीं समझता, क्योंकि पैरामीटर को वैकल्पिक कहा जाता है, https://stackoverflow.com/a/44645943/3254117 देखें


1
रनिंग ./ टर्मिनल से स्वच्छ निर्माण महत्वपूर्ण था। मेरे लिए मुझे यह संदेश मिला: ऐप: 'एनोटेशनप्रोसेसर' की निर्भरता को कैप्ट एनोटेशन प्रोसेसर के रूप में मान्यता नहीं दी जाएगी। कृपया इन कलाकृतियों के लिए विन्यास नाम को 'kapt' में बदलें: 'android.arch.lifecycle: compiler: 1.1.1' और kapt प्लगइन लागू करें: "प्लगइन लागू करें: 'kotlin-kapt'।"
रैंडी

आह, टर्मिनल में कार्यों को निष्पादित करने से मुझे अतीत में बहुत मदद मिली। आईडीई में निर्माण उपकरण संदेश अक्सर मूल त्रुटि संदेश "हज" करते हैं
हजो

3

निम्न ग्रेड लिंक का उपयोग करें:

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

आपको अलग-अलग सिंग्लोन वर्ग बनाने और इस तरह से एपीडैबेस को पाने की आवश्यकता है:

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
}

मैंने कंस्ट्रक्टर नहीं बनाया, मैं सीधे स्थिर उदाहरण के माध्यम से उपयोग कर रहा हूं।
प्रतिक देसाई

मैंने कक्ष डेटाबेस के लिए एक नमूना परियोजना बनाई है जिसे आप यहाँ देख सकते हैं: github.com/burhanrashid52/Android-Room-Data-Persistent
बुरहानुद्दीन रशीद

2
हाँ, मैंने अपडेट किया, लेकिन एक ही त्रुटि दे दी, AppDatabase_Impl मौजूद नहीं है
pratik deshai

@pratikdeshai: क्या आपने वह त्रुटि ठीक की है ?? मुझे भी वही त्रुटि मिलती है, इस कारण अटक जाते हैं।
जयेश

2

मेरे मामले में, मैं कमरे के डेटाबेस के लिए कनेक्टिविटी का परीक्षण कर रहा था और मैंने परीक्षण वर्ग को निर्देशिका के अंदर रखा है जो मैंने AndroidTest फ़ोल्डर के अंदर बनाया है। मैंने इसे कस्टम निर्देशिका से बाहर कर दिया है, तब इसने बहुत अच्छा काम किया।


यह मेरा मुद्दा भी है। किसी भी विचार यह क्यों हो रहा है और इससे कैसे बचा जाए? मैं नहीं बल्कि TestDatabaseरिलीज कोड में एक होना पसंद करेंगे ।
एडुआर्डो

2

मेरे साथ वही घटना घटी।

निम्नलिखित

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

किसी अन्य बिल्ड त्रुटि के कारण जोड़ने पर लॉग से कारण ट्रैक करता है।

मेरे मामले में, SQL कार्यान्वयन में एक त्रुटि थी। तय करने के बाद, बिल्ड सफल रहा।

इसलिए आप दुर्घटनाग्रस्त स्थानीय लोगों को देखने के बजाय पूरे कमरे के पुस्तकालय के कार्यान्वयन की जांच कर सकते हैं।


1

समस्या सही लाइब्रेरी के आसपास अधिक है जो कि ग्रेडेल बिल्ड में शामिल नहीं है। मेरे पास एक समान मुद्दा था और लापता को जोड़ा

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


1

मेरी ग्रेड फ़ाइल में निर्भरताएँ बदलने से मुझे त्रुटि को ठीक करने में मदद नहीं मिली। मैंने इस डेटाबेस एनोटेशन को कक्षा में याद किया था जहाँ कक्ष डेटाबेस को आरंभीकृत किया गया था जो इस समस्या का कारण बन रहा था।

@ डाटबेस (इकाइयां = [उपयोगकर्ता नाम :: वर्ग], संस्करण = १)

सुनिश्चित करें कि उपर्युक्त एनोटेशन में निर्दिष्ट इकाई मॉडल विशेष मॉडल वर्ग को संदर्भित करता है


यह वही है जो मैंने याद किया
pjwin

0

मेरे लिए, जैसे ही आप किसी भी कक्ष डेटाबेस से संबंधित आयातों को शामिल करते हैं, एंड्रॉइड स्टूडियो ने स्वचालित रूप से निर्भरता को अपडेट किया। लेकिन 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

यहाँ उदाहरण पढ़ना: कक्ष उदाहरण

मैंने इस त्रुटि को केवल सही का उपयोग करके तय किया (मुझे लगता है कि यह है) एनोटेशनप्रोसेसर, इस प्रकार है:

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

इसके अलावा, मैं 2.2.0 में या तो रूम वर्जन में अपग्रेड हुआ जैसे कि लाइफसाइकल संस्करण में।

एक बार सिंक करने के बाद, मैं रूम के साथ काम करना शुरू कर सकता हूं।

इतनी अच्छी किस्मत! और कोड को अपने साथ रखें!


0

मेरे कोटलिन ऐप में, मैंने अपनी बिल्ड.ग्रेड फ़ाइल के शीर्ष पर केवल निम्न पंक्ति जोड़ी:

apply plugin: 'kotlin-kapt'

और निर्भरता अनुभाग में निम्नलिखित पंक्ति:

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

मुझे उम्मीद है कि यह आपके मुद्दे को ठीक कर देगा।


0

ओपी के मामले में नहीं, लेकिन यह तब भी होता है जब आप गलती से इस तरह एनोटेशनप्रोसेसर के बजाय कार्यान्वयन का उपयोग करते हैं:

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

इसके अलावा:

annotationProcessor "android.arch.persistence.room:compiler:x.x.x"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.