首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >关闭ContentProvider中的数据库

关闭ContentProvider中的数据库
EN

Stack Overflow用户
提问于 2010-12-29 00:19:16
回答 3查看 24.6K关注 0票数 73

本周,我学习了所有关于ContentProvider的知识,并使用SQLiteOpenHelper类在提供者中管理数据库的创建和升级。具体地说,我一直在通读sdk的samples目录中的NotePad示例。

现在,我可以看到SQLiteOpenHelper有一个close()方法。我知道让空闲数据库保持开放是一种糟糕的做法,可能会导致内存泄漏等问题(除非this讨论的方向是正确的)。如果我在活动中使用这个类,那么我会简单地在onDestroy()方法中调用close(),但据我所知,ContentProvider没有与活动相同的生命周期。NotePad的代码似乎从未调用过close(),所以我假设它是由SQLiteOpenHelper或其他部分处理的,但我真的很想确认一下。我也不是很信任示例代码……

问题摘要:我们应该在什么时候关闭提供者中的数据库?

EN

回答 3

Stack Overflow用户

发布于 2011-01-27 04:37:46

如果希望数据库自动关闭,可以在打开数据库时提供一个CursorFactory

代码语言:javascript
复制
mContext.openOrCreateDatabase(DB_NAME, SQLiteDatabase.OPEN_READWRITE, new LeaklessCursorFactory());

以下是类:

代码语言:javascript
复制
public class LeaklessCursorFactory implements CursorFactory {
    @Override
    public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery,
        String editTable, SQLiteQuery query) {
        return new LeaklessCursor(db,masterQuery,editTable,query);
    }
}


public class LeaklessCursor extends SQLiteCursor {
    static final String TAG = "LeaklessCursor";
    final SQLiteDatabase mDatabase;

    public LeaklessCursor(SQLiteDatabase database, SQLiteCursorDriver driver, String table, SQLiteQuery query) {
        super(database, driver, table, query);
        mDatabase = database;
    }

    @Override
    public void close() {
        Log.d(TAG, "Closing LeaklessCursor: " + mDatabase.getPath());
        super.close();
        if (mDatabase != null) {
            mDatabase.close();
        }
    }
}
票数 7
EN

Stack Overflow用户

发布于 2011-01-05 01:52:55

完成后关闭它,最好是在finally块中,这样您就可以确保它发生。我知道这听起来有点陈词滥调和即兴,但这真的是我所知道的唯一答案。如果您打开数据库并执行某个操作,请在完成该操作后将其关闭,除非您知道将再次需要该数据库(在这种情况下,请确保在不再需要它时将其关闭)。

票数 1
EN

Stack Overflow用户

发布于 2011-01-20 11:33:38

如果您在活动中使用您的内容提供商,那么我不认为您必须保持与内容提供商的连接。您可以使用startManagingCursor来管理返回的游标对象。在活动的onPause方法中,您可以释放内容提供者。(您可以在onResume中重新加载它)。假设活动生命周期通常是有限的,这就足够了。(至少在我看来是这样;)

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

https://stackoverflow.com/questions/4547461

复制
相关文章

相似问题

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