【发布时间】:2013-07-24 12:48:24
【问题描述】:
我正在创建一个与数据库进行大量交互(读取和写入操作)的应用程序。
为了避免在每次请求时进行打开/关闭操作,我创建了一个扩展 SQLiteOpenHelper 的类,它采用单例设计模式。这样,我确信在所有 application 生命周期(而不仅仅是 activity 生命周期)中,只有一个 SQLiteOpenHelper 实例和一个与数据库的连接。
我也阅读了一些关于 ContentProvider 的文章,但我不确定这是一个更好的方法。
所以,这是我的 Singleton 类的主要逻辑(onCreate 和 onUpgrade 已删除):
public final class BaseSQLite extends SQLiteOpenHelper {
private static BaseSQLite mInstance = null;
private SQLiteDatabase db = null;
public static BaseSQLite getInstance(Context context) {
if (mInstance == null) {
mInstance = new BaseSQLite(context.getApplicationContext(),
DBNAME, DBVERSION);
}
return mInstance;
}
private BaseSQLite(final Context context, final String name,
final int version) {
super(context, name, null, version);
db = getWritableDatabase();
}
@Override
public synchronized void close() {
if (mInstance != null)
db.close();
}
public Cursor getAllData() {
String buildSQL = "SELECT * FROM myTable";
return db.rawQuery(buildSQL, null);
}
}
所以,为了访问我的数据库,我做了这个:
BaseSQLite baseSQLite = BaseSQLite.getInstance(context);
baseSQLite.getAllData();
它现在完美运行。但我的问题是关于close() 方法。我真的不知道什么时候打电话。实际上,我的数据库实例对于我的应用程序的每个 Activies 都是相同的,所以我认为在 onPause() 方法中调用 close() 是一个坏主意,因为该实例可能(并且经常会发生)在onStart() 下一个 Activity 的方法。此外,我无法检测到我的应用程序的end,即当屏幕上不再可见活动时。
有人可以帮我解决这个问题吗?当数据库链接到 ONE 活动时,我找到了一些答案,但没有为我的案例提供真正的提示。
【问题讨论】:
标签: android android-sqlite android-lifecycle sqliteopenhelper