Не удается получить ЭКЗЕМПЛЯР БД с помощью суперкласса AndroidViewModel и комнаты

В моем приложении MVVM я расширяю AndroidViewModel и через класс репозитория пытаюсь получить экземпляр БД (в отдельном абстрактном классе, который расширяет суперкласс RoomDatabase). Я вызываю ViewModel из класса MainActivity методом ViewModelProviders. Я получаю следующую ошибку:

Вот вся трассировка стека исключения:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.roomlistingapllicate, PID: 31766
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.roomlistingapllicate/com.example.roomlistingapllicate.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.roomlistingapllicate.NOtesViewModel
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2572)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654)
        at android.app.ActivityThread.access$900(ActivityThread.java:175)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488)
        at android.os.Handler.dispatchMessage(Handler.java:111)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:5728)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
     Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.roomlistingapllicate.NOtesViewModel
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:238)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:164)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:130)
        at com.example.roomlistingapllicate.MainActivity.onCreate(MainActivity.java:19)
        at android.app.Activity.performCreate(Activity.java:6309)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2519)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654) 
        at android.app.ActivityThread.access$900(ActivityThread.java:175) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488) 
        at android.os.Handler.dispatchMessage(Handler.java:111) 
        at android.os.Looper.loop(Looper.java:207) 
        at android.app.ActivityThread.main(ActivityThread.java:5728) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance(Native Method)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:230)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:164) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:130) 
        at com.example.roomlistingapllicate.MainActivity.onCreate(MainActivity.java:19) 
        at android.app.Activity.performCreate(Activity.java:6309) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2519) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654) 
        at android.app.ActivityThread.access$900(ActivityThread.java:175) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488) 
        at android.os.Handler.dispatchMessage(Handler.java:111) 
        at android.os.Looper.loop(Looper.java:207) 
        at android.app.ActivityThread.main(ActivityThread.java:5728) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 
     Caused by: java.lang.RuntimeException: cannot find implementation for com.example.roomlistingapllicate.NotesDatabase. NotesDatabase_Impl does not exist
        at androidx.room.Room.getGeneratedImplementation(Room.java:94)
        at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:851)
        at com.example.roomlistingapllicate.NotesDatabase.getInstance(NotesDatabase.java:23)
        at com.example.roomlistingapllicate.NoteRepository.<init>(NoteRepository.java:15)
        at com.example.roomlistingapllicate.NOtesViewModel.<init>(NOtesViewModel.java:15)
        at java.lang.reflect.Constructor.newInstance(Native Method) 
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:230) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:164) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:130) 
        at com.example.roomlistingapllicate.MainActivity.onCreate(MainActivity.java:19) 
        at android.app.Activity.performCreate(Activity.java:6309) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2519) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654) 
        at android.app.ActivityThread.access$900(ActivityThread.java:175) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488) 
        at android.os.Handler.dispatchMessage(Handler.java:111) 
        at android.os.Looper.loop(Looper.java:207) 
        at android.app.ActivityThread.main(ActivityThread.java:5728) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 

Я работаю над аркой AndroidX. Вот некоторые части кода, в которых, как мне кажется, скрывается проблема:

import androidx.appcompat.app.AppCompatActivity;

import androidx.lifecycle.ViewModelProviders;

import android.os.Bundle;


public class MainActivity extends AppCompatActivity {

    private NOtesViewModel nOtesViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nOtesViewModel = ViewModelProviders.of(this).get(NOtesViewModel.class);

    }
}


import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import java.util.List;

public class NOtesViewModel extends AndroidViewModel {
    private NoteRepository noteRepository;
    private LiveData<List<Note>> allNotes;

    public NOtesViewModel(@NonNull Application application) {
        super(application);
        noteRepository = new NoteRepository(application);
        allNotes = noteRepository.getAllNotes();
    }


import android.app.Application;
import android.os.AsyncTask;

import androidx.lifecycle.LiveData;

import java.util.List;

public class NoteRepository {
    private NoteDAO noteDAO;
    private LiveData<List<Note>> allNotes;

    public NoteRepository(Application application) {
        NotesDatabase notesDatabase = NotesDatabase.getInstance(application.getApplicationContext());
        noteDAO = notesDatabase.noteDAO();
        allNotes = noteDAO.getAllNotes();
    }


import android.content.Context;
import android.os.AsyncTask;

import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.sqlite.db.SupportSQLiteDatabase;

@Database(entities = {Note.class}, version = 1)
public abstract class NotesDatabase extends RoomDatabase {

    private static NotesDatabase instance;
    public abstract NoteDAO noteDAO();

    public static synchronized NotesDatabase getInstance(Context context) {
        if (instance == null) {
            instance = Room.databaseBuilder(context.getApplicationContext(), NotesDatabase.class,
                    "note_database").fallbackToDestructiveMigration()
                    .addCallback(roomCallback)
                    .build();
        }
        return instance;
    }

person Trajce Arsovski    schedule 01.05.2019    source источник
comment
Возможный дубликат дополнительных аргументов Android ViewModel   -  person ronginat    schedule 01.05.2019
comment
Если есть дубликат, я его не вижу. Кстати, я попытался сузить аргумент, например, после application.getApplicationContext(), но это не сработало (я знал, что это не сработает, но все же...). Но да, ошибка возникает, когда я передаю аргумент из файла репозитория (NoteRepository.class) в файл абстрактного класса расширенного суперкласса RoomDatabase: NoteDatabase noteDatabase = NoteDatabase.getInstanceOfTheDB(application), поэтому запрос метода getInstanceOfTheDB (контекст контекста) в качестве аргументов.   -  person Trajce Arsovski    schedule 01.05.2019
comment
Можете ли вы показать нам всю трассировку стека исключения?   -  person JensV    schedule 01.05.2019
comment
@JensV Я отредактировал свой ответ, добавив трассировку стека исключения   -  person Trajce Arsovski    schedule 01.05.2019


Ответы (1)


Stacktrace говорит, что вы получаете эту ошибку, потому что Room не может найти реализацию вашего абстрактного класса базы данных Notes.

Убедитесь, что вы добавили зависимость обработчика аннотаций комнаты в файл build.gradle вашего приложения.

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

Изменить: если вы используете Kotlin, используйте kapt вместо annotationProcessor и обязательно добавьте apply plugin: 'kotlin-kapt' в начало файла build.gradle приложения.

person harold_admin    schedule 01.05.2019
comment
Большое спасибо. Я использовал androidTestImplementatin вместо annotationProcessor. Проблема решена. - person Trajce Arsovski; 01.05.2019