本周,我学习了所有关于ContentProvider的知识,并使用SQLiteOpenHelper类在提供者中管理数据库的创建和升级。具体地说,我一直在通读sdk的samples目录中的NotePad示例。
现在,我可以看到SQLiteOpenHelper有一个close()方法。我知道让空闲数据库保持开放是一种糟糕的做法,可能会导致内存泄漏等问题(除非this讨论的方向是正确的)。如果我在活动中使用这个类,那么我会简单地在onDestroy()方法中调用close(),但据我所知,ContentProvider没有与活动相同的生命周期。NotePad的代码似乎从未调用过close(),所以我假设它是由SQLiteOpenHelper或其他部分处理的,但我真的很想确认一下。我也不是很信任示例代码……
问题摘要:我们应该在什么时候关闭提供者中的数据库?
发布于 2011-01-27 04:37:46
如果希望数据库自动关闭,可以在打开数据库时提供一个CursorFactory
:
mContext.openOrCreateDatabase(DB_NAME, SQLiteDatabase.OPEN_READWRITE, new LeaklessCursorFactory());
以下是类:
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();
}
}
}
发布于 2011-01-05 01:52:55
完成后关闭它,最好是在finally块中,这样您就可以确保它发生。我知道这听起来有点陈词滥调和即兴,但这真的是我所知道的唯一答案。如果您打开数据库并执行某个操作,请在完成该操作后将其关闭,除非您知道将再次需要该数据库(在这种情况下,请确保在不再需要它时将其关闭)。
发布于 2011-01-20 11:33:38
如果您在活动中使用您的内容提供商,那么我不认为您必须保持与内容提供商的连接。您可以使用startManagingCursor来管理返回的游标对象。在活动的onPause方法中,您可以释放内容提供者。(您可以在onResume中重新加载它)。假设活动生命周期通常是有限的,这就足够了。(至少在我看来是这样;)
https://stackoverflow.com/questions/4547461
复制相似问题