使用 Dagger2 时 Dao 为空
Dao is null while using Dagger2
当我在 Presenter 中调用 DAO 时,它 returns 为 null 并导致 NPE。
一些代码在这里:
DAO class
@Dao
public interface ElementsDao {
@Query("SELECT * FROM `elements`")
Flowable<List<Elements>> getAll();
@Insert
Maybe<Long> insert(Elements element);...
}
模块 classes:
@Module
public class DatabaseModule {
private AppDatabase appDatabase;
public DatabaseModule(Application mApplication){
appDatabase = Room.databaseBuilder(mApplication, AppDatabase.class,"dbWarehouse")
.setJournalMode(RoomDatabase.JournalMode.TRUNCATE)
.build();
}
@Singleton
@Provides
public AppDatabase provideDatabase(){
return appDatabase;
}
@Singleton
@Provides
ElementsDao providesElementsDao(AppDatabase appDatabase){
return appDatabase.getElementsDao();
}
}
@Module
public class AppModule {
Application mApplication;
public AppModule(Application application){
mApplication = application;
}
@Provides
@Singleton
Application providesApplication() {
return mApplication;
}
}
组件class
@Singleton
@Component(dependencies = {},modules = {AppModule.class, DatabaseModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
void inject(ElementsActivity elementsActivity);
void inject(ActivityElementsPresenter activityElementsPresenter);
ElementsDao elementsDao();
AppDatabase appDatabase();
Application application();
}
应用class(在清单中声明)
public class App extends Application {
private static AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
initDagger();
}
private void initDagger(){
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.databaseModule(new DatabaseModule(this))
.build();
}
public static AppComponent getAppComponent() {
return appComponent;
}
}
和主持人
@InjectViewState
public class ActivityElementsPresenter extends MvpPresenter<ActivityElementsView> {
@Inject
ElementsDao elementsDao;
public void addElement(Elements element){
elementsDao.insert(element).subscribeOn(Schedulers.io())...
更新
应用程序数据库 class
@Database(entities = {Elements.class}, version = 1, exportSchema = false)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract ElementsDao getElementsDao();
//...
}
调试时我在演示器中设置了一个点,发现 dao 没有初始化
elementsDao
尝试使用 App.getAppComponent().elementsDao();
之类的东西,但它也能正常工作。
你需要这样做,
@InjectViewState
public class ActivityElementsPresenter extends MvpPresenter<ActivityElementsView> {
@Inject
ElementsDao elementsDao;
public ActivityElementsPresenter(){
App.getAppComponent().inject(this);//calling the dagger's injector to inject dependency.
}
public void addElement(Elements element){
elementsDao.insert(element).subscribeOn(Schedulers.io())...
}
}
然后在
@Singleton
@Component(dependencies = {},modules = {AppModule.class, DatabaseModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
void inject(ElementsActivity elementsActivity);
void inject(ActivityElementsPresenter activityElementsPresenter);//will inject dependency to ActivityElementsPresenter.
}
当我在 Presenter 中调用 DAO 时,它 returns 为 null 并导致 NPE。 一些代码在这里: DAO class
@Dao
public interface ElementsDao {
@Query("SELECT * FROM `elements`")
Flowable<List<Elements>> getAll();
@Insert
Maybe<Long> insert(Elements element);...
}
模块 classes:
@Module
public class DatabaseModule {
private AppDatabase appDatabase;
public DatabaseModule(Application mApplication){
appDatabase = Room.databaseBuilder(mApplication, AppDatabase.class,"dbWarehouse")
.setJournalMode(RoomDatabase.JournalMode.TRUNCATE)
.build();
}
@Singleton
@Provides
public AppDatabase provideDatabase(){
return appDatabase;
}
@Singleton
@Provides
ElementsDao providesElementsDao(AppDatabase appDatabase){
return appDatabase.getElementsDao();
}
}
@Module
public class AppModule {
Application mApplication;
public AppModule(Application application){
mApplication = application;
}
@Provides
@Singleton
Application providesApplication() {
return mApplication;
}
}
组件class
@Singleton
@Component(dependencies = {},modules = {AppModule.class, DatabaseModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
void inject(ElementsActivity elementsActivity);
void inject(ActivityElementsPresenter activityElementsPresenter);
ElementsDao elementsDao();
AppDatabase appDatabase();
Application application();
}
应用class(在清单中声明)
public class App extends Application {
private static AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
initDagger();
}
private void initDagger(){
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.databaseModule(new DatabaseModule(this))
.build();
}
public static AppComponent getAppComponent() {
return appComponent;
}
}
和主持人
@InjectViewState
public class ActivityElementsPresenter extends MvpPresenter<ActivityElementsView> {
@Inject
ElementsDao elementsDao;
public void addElement(Elements element){
elementsDao.insert(element).subscribeOn(Schedulers.io())...
更新 应用程序数据库 class
@Database(entities = {Elements.class}, version = 1, exportSchema = false)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract ElementsDao getElementsDao();
//...
}
调试时我在演示器中设置了一个点,发现 dao 没有初始化
elementsDao
尝试使用 App.getAppComponent().elementsDao();
之类的东西,但它也能正常工作。
你需要这样做,
@InjectViewState
public class ActivityElementsPresenter extends MvpPresenter<ActivityElementsView> {
@Inject
ElementsDao elementsDao;
public ActivityElementsPresenter(){
App.getAppComponent().inject(this);//calling the dagger's injector to inject dependency.
}
public void addElement(Elements element){
elementsDao.insert(element).subscribeOn(Schedulers.io())...
}
}
然后在
@Singleton
@Component(dependencies = {},modules = {AppModule.class, DatabaseModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
void inject(ElementsActivity elementsActivity);
void inject(ActivityElementsPresenter activityElementsPresenter);//will inject dependency to ActivityElementsPresenter.
}