Java Android应用程序中的DB连接位置

Java Android应用程序中的DB连接位置,java,android,memory-leaks,dagger-2,greendao,Java,Android,Memory Leaks,Dagger 2,Greendao,我在Android应用程序中集成数据库连接的位置/方式上遇到了一些问题。在尝试了几种不同的方法之后,我决定扩展应用程序类并将其放入其中。据我所知,我需要它是静态的,这样我就可以从任何地方访问它,我使用的是GreenDAO,它需要应用程序上下文才能工作 问题是现在我已经开始使用Dagger2(我不太理解,但不知怎么的,它已经工作了),但是它不允许静态注入。下面是MyApp类: public class MyApp extends Application { @Inject public Data

我在Android应用程序中集成数据库连接的位置/方式上遇到了一些问题。在尝试了几种不同的方法之后,我决定扩展应用程序类并将其放入其中。据我所知,我需要它是静态的,这样我就可以从任何地方访问它,我使用的是GreenDAO,它需要应用程序上下文才能工作

问题是现在我已经开始使用Dagger2(我不太理解,但不知怎么的,它已经工作了),但是它不允许静态注入。下面是MyApp类:

public class MyApp extends Application {

@Inject
public DataSource dataSource;

private static MyApp instance;

public MyApp() {
    instance = this;
}

@Override
public void onCreate() {
    super.onCreate();

    // Connect to our datasource
    if (dataSource == null) {
         DaggerDataSourceComponent.builder().dataSourceModule(new DataSourceModule(getInstance())).build();
    }
}

public static MyApp getInstance() {
    return instance;
}

public DataSource getDataSource() {
    return dataSource;
}
}

这是我的数据源类:

public class DataSource {

public DaoSession daoSession;
Context context;
public Database db;
@Inject
public DaoMaster.DevOpenHelper helper;

public DataSource(Context context, DaoMaster.DevOpenHelper helper) {
    this.context = context;
    this.helper = helper;

    db = this.helper.getWritableDb();
    daoSession = new DaoMaster(db).newSession();
}
一般来说,这一切工作正常,但一旦我开始旋转屏幕,我得到数据库内存泄漏。我认为这是因为数据库不是静态的,并且在每次旋转时都被重新创建?我不能在我的活动中创建数据库连接,因为我在MVP中了解到,活动应该不知道这些事情

任何关于如何解决这些内存泄漏的建议都将不胜感激

更新:


在玩过之后,MyApp中的数据源注入似乎并没有真正起作用,结果它只在我的Interactior类中起作用(它也注入数据源),所以我没有意识到它在MyApp类中什么都没做。不过,如果可能的话,我还是想在这个MyApp类中对它进行排序,这样我就可以全局访问单个连接(除非有更好的方法)。

看起来我很愚蠢。在MyApp中,我需要添加.inject(这个),所以

变成

DaggerDataSourceComponent.builder().dataSourceModule(new DataSourceModule(getInstance())).build().inject(this);
我现在有一个数据库连接,即使活动被破坏,它也会被创建并保持,并且可以在整个应用程序中这样访问:

dataSource = MyApp.getInstance().getDataSource();
不确定这是否是一个好的做法,但它解决了我的问题。如果有人对如何组织这个有更好的想法,我很高兴听到

dataSource = MyApp.getInstance().getDataSource();