android - 使用 Singleton 设计模式正确打开/关闭数据库

标签 android android-sqlite android-lifecycle sqliteopenhelper

我正在创建一个与数据库进行大量交互(读取和写入操作)的应用程序。

为了避免在每次请求时都进行打开/关闭操作,我创建了一个使用单例设计模式扩展 SQLiteOpenHelper 的类。这样,我可以确定在所有应用程序生命周期(不仅是 Activity 生命周期)。

我也阅读了一些关于 ContentProvider 的文章,但我不确定这是更好的方法。

所以,这是我的 Singleton 类的主要逻辑(onCreateonUpgrade 已删除):

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() 是个坏主意,因为该实例可能(并且它经常会发生)在下一个 Activity 的 onStart() 方法中重新创建。此外,我无法检测到我的应用程序的结束,即当屏幕上不再显示任何 Activity 时。

有人可以帮我解决这个问题吗?当数据库链接到 ONE Activity 时,我找到了一些答案,但没有针对我的情况给出真正的提示。

最佳答案

您应该在完成写入数据库的任何时候调用 close。例如,当您插入数据时,您将打开一个到数据库的连接,完成后应该将其关闭。

读书不一样。当您在手机上创建 SQLite 数据库时,数据是持久的。数据库存在,您创建的处理程序提供了一种访问该信息的便捷方式。读取数据库通常是通过获取数据库的可读实例并使用 Cursor 提取值来进行的。在这种情况下,您会在完成后关闭游标,而不是数据库本身。

您是对的,您不应该在单独 Activity 的生命周期方法期间关闭数据库连接。相反,如上所述,当您完成该事务时,关闭写入数据库的处理程序方法中的数据库连接。

关于android - 使用 Singleton 设计模式正确打开/关闭数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17834494/

相关文章:

android - 如何在android中计算耗时和日期

android - Activity 流程 : OnCreate called when I want to resume my activity

Android:如何限制下载速度

android - android设备中的图像缩放

java - 如何根据第一个微调器中所做的选择从数据库中过滤第二个微调器值?

android - 获取联系人并将其保存到 SQLite 数据库,长时间阻塞 UI

android - 如何在销毁创建周期之间保存 tabhost 选项卡

android - 从相机应用程序返回时重新创建 Activity

android - 使用游标填充后将项目添加到 ListView

java - 用户表、评级表和位置表之间的关系是什么?