首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >安卓SQLite DB何时关闭

安卓SQLite DB何时关闭
EN

Stack Overflow用户
提问于 2010-12-30 03:25:48
回答 4查看 67.4K关注 0票数 101

我正在使用安卓系统上的SQLite数据库。我的数据库管理器是一个单例,现在它在初始化时打开一个到数据库的连接。让数据库一直处于打开状态是安全的,这样当有人调用我的类来使用数据库时,它就已经打开了?或者我应该在每次访问之前和之后打开和关闭数据库。让它一直开着有什么害处吗?

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-30 03:32:35

我会让它一直处于打开状态,并以某种生命周期方法(如onStoponDestroy )将其关闭。这样,您就可以在每次使用数据库之前,通过在单个SQLiteDatabase对象上调用isDbLockedByCurrentThreadisDbLockedByOtherThreads来轻松地检查数据库是否已经在使用中。这将防止对数据库进行多次操作,并将应用程序从潜在的崩溃中拯救出来

因此,在您的单例中,您可能有这样一个方法来获取您的单个SQLiteOpenHelper对象:

代码语言:javascript
复制
private SQLiteDatabase db;
private MyDBOpenHelper mySingletonHelperField;
public MyDBOpenHelper getDbHelper() {
    db = mySingletonHelperField.getDatabase();//returns the already created database object in my MyDBOpenHelper class(which extends `SQLiteOpenHelper`)
    while(db.isDbLockedByCurrentThread() || db.isDbLockedByOtherThreads()) {
        //db is locked, keep looping
    }
    return mySingletonHelperField;
}

所以每当你想要使用你的打开的辅助对象时,调用这个getter方法(确保它是线程的)

单例中的另一个方法可能是(每次尝试调用上面的getter之前都会调用):

代码语言:javascript
复制
public void setDbHelper(MyDBOpenHelper mySingletonHelperField) {
    if(null == this.mySingletonHelperField) {
        this.mySingletonHelperField = mySingletonHelperField;
        this.mySingletonHelperField.setDb(this.mySingletonHelperField.getWritableDatabase());//creates and sets the database object in the MyDBOpenHelper class
    }
}

您可能还想关闭单例中的数据库:

代码语言:javascript
复制
public void finalize() throws Throwable {
    if(null != mySingletonHelperField)
        mySingletonHelperField.close();
    if(null != db)
        db.close();
    super.finalize();
}

如果您的应用程序的用户能够非常快速地创建许多数据库交互,那么您应该使用我在上面演示过的东西。但如果只有最少的数据库交互,我就不会担心了,每次都会创建和关闭数据库。

票数 60
EN

Stack Overflow用户

发布于 2018-02-22 08:54:45

从性能的角度来看,最好的方法是在应用程序级别上保留单个SQLiteOpenHelper实例。打开数据库可能很昂贵,而且是阻塞操作,因此不应该在主线程和/或活动生命周期方法中完成。

当不使用数据库时,可以使用setIdleConnectionTimeout()方法(在Android8.1中引入)来释放内存。如果设置了空闲超时,则数据库连接将在一段时间不活动后关闭,即未访问数据库时。当执行新的查询时,连接将对应用程序透明地重新打开。

除此之外,应用程序可以在进入后台或检测到内存压力时调用releaseMemory(),例如在onTrimMemory()

票数 1
EN

Stack Overflow用户

发布于 2014-12-20 18:36:34

您也可以使用ContentProvider。它会为你做这些事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4557154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档