Как подружить 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 компонент и инжектите базу данных