Как подружить room и dagger 2

Только начал изучать Dagger 2 и столкнулся с ошибкой. Есть класс App. В нем я собираю компонент и передаю Context в модуль DataBaseModule.

public class App extends Application {

    private AppComponent mApplicationComponent;


    @Override
    public void onCreate() {
        super.onCreate();
        mApplicationComponent = DaggerAppComponent.builder().dataBaseModule(new DataBaseModule(this)).build();
    }


    public AppComponent getComponent() {
        return mApplicationComponent;
    }

}

В модуле DataBaseModule я хотел бы собрать бд и предоставлять dao. Но это невозможно так как контекст в таком случае будет нулевым.

@Module
public class DataBaseModule {

    private AppDataBase dataBase;
    private Context context;

    @Inject
    DataBaseModule() {
        dataBase = Room.databaseBuilder(context
                , AppDataBase.class, "database")
                .build();
    }

    public DataBaseModule(Context context) {
        this.context = context;
    }

    @Singleton
    @Provides
    public AppDataBase getDataBase() {
        return dataBase;
    }

    @Singleton
    @Provides
    public CategoryDao getCategoryDao(AppDataBase db) {

        return db.categoryDao();
    }

    @Singleton
    @Provides
    public ExpensesDao getExpensesDao(AppDataBase db) {
        return db.spendingDao();
    }

    @Singleton
    @Provides
    public FinPlanDao getFinPlanDao(AppDataBase db) {
        return db.finPlanDao();
    }

}
Какие есть пути решения данной проблемы?


Ответы (1 шт):

Автор решения: IR42
@Module
public class DataBaseModule {

    private Context context;

    public DataBaseModule(Context context) {
        this.context = context;
    }

    @Singleton
    @Provides
    public AppDataBase getDataBase() {
        return Room.databaseBuilder(context, AppDataBase.class, "database").build();
    }

    // остальные методы
}

Ничего тут не нужно кэшировать, @Singleton всё сделает за вас. Да и кэшировали вы неправильно, зачем-то сделали второй конструктор с @Inject в котором и создавали БД, а не в том, в котором context

Получаете в активити ваш кэшированный в App компонент и инжектите базу данных

→ Ссылка