在 Android 应用程序中放置数据库连接的位置
Where to put DB connection in Android Application
我在 where/how 上遇到了一些问题,无法将数据库连接集成到我的 Android 应用程序中。在尝试了几种不同的方法后,我决定扩展应用程序 class 并将其放在那里。据我了解,虽然我需要它是静态的,以便我可以从任何地方访问它,并且我正在使用需要应用程序上下文才能工作的 GreenDAO。
现在的问题是我已经开始使用 Dagger2(我不是很了解它,但不知何故让它工作了),但它不允许静态注入。下面是 MyApp class:
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;
}
}
这是我的数据源 class:
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();
}
通常这一切都可以正常工作,但是一旦我开始旋转屏幕,我就会发现数据库内存泄漏。我认为这是因为数据库不是静态的,并且在每次轮换时都会重新创建?我无法在我的 Activity 中创建数据库连接,因为我在 MVP 中了解到 activity 应该不知道这些事情。
任何关于我应该如何解决这些内存泄漏的建议都将不胜感激。
更新:
玩过之后,似乎在 MyApp 中注入 DataSource 并没有真正起作用,事实证明它只在我的交互器 class 中起作用(它也注入了 DataSource),所以我没有意识到它在 MyApp class 中什么也没做。如果可能的话,我还是希望在这个 MyApp class 中对其进行排序,这样我就可以全局访问单个连接(除非有更好的方法)。
看来我是傻了。在 MyApp 中我需要添加 .inject(this),所以
DaggerDataSourceComponent.builder().dataSourceModule(new DataSourceModule(getInstance())).build();
变成
DaggerDataSourceComponent.builder().dataSourceModule(new DataSourceModule(getInstance())).build().inject(this);
我现在有一个创建的数据库连接,即使在活动被销毁时仍然存在,并且可以在整个应用程序中像这样访问:
dataSource = MyApp.getInstance().getDataSource();
不确定这是否是好的做法,但它解决了我的问题。如果有人对如何构建本文有任何更好的想法,很高兴听到。
我在 where/how 上遇到了一些问题,无法将数据库连接集成到我的 Android 应用程序中。在尝试了几种不同的方法后,我决定扩展应用程序 class 并将其放在那里。据我了解,虽然我需要它是静态的,以便我可以从任何地方访问它,并且我正在使用需要应用程序上下文才能工作的 GreenDAO。
现在的问题是我已经开始使用 Dagger2(我不是很了解它,但不知何故让它工作了),但它不允许静态注入。下面是 MyApp class:
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;
}
}
这是我的数据源 class:
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();
}
通常这一切都可以正常工作,但是一旦我开始旋转屏幕,我就会发现数据库内存泄漏。我认为这是因为数据库不是静态的,并且在每次轮换时都会重新创建?我无法在我的 Activity 中创建数据库连接,因为我在 MVP 中了解到 activity 应该不知道这些事情。
任何关于我应该如何解决这些内存泄漏的建议都将不胜感激。
更新:
玩过之后,似乎在 MyApp 中注入 DataSource 并没有真正起作用,事实证明它只在我的交互器 class 中起作用(它也注入了 DataSource),所以我没有意识到它在 MyApp class 中什么也没做。如果可能的话,我还是希望在这个 MyApp class 中对其进行排序,这样我就可以全局访问单个连接(除非有更好的方法)。
看来我是傻了。在 MyApp 中我需要添加 .inject(this),所以
DaggerDataSourceComponent.builder().dataSourceModule(new DataSourceModule(getInstance())).build();
变成
DaggerDataSourceComponent.builder().dataSourceModule(new DataSourceModule(getInstance())).build().inject(this);
我现在有一个创建的数据库连接,即使在活动被销毁时仍然存在,并且可以在整个应用程序中像这样访问:
dataSource = MyApp.getInstance().getDataSource();
不确定这是否是好的做法,但它解决了我的问题。如果有人对如何构建本文有任何更好的想法,很高兴听到。