源码 /** * Close any open database object. */ public synchronized void close() { if (mIsInitializing) throw new IllegalStateException("Closed during initialization"); if (mDatabase != null && mDatabase.isOpen()) { mDatabase.close(); mDatabase = null; } } public SQLiteDatabase getWritableDatabase() { synchronized (this) { return getDatabaseLocked(true); } }
那为什么 insertByDto里面把 数据库关掉后下次还能操作呢?
/**
* Close any open database object.
*/
public synchronized void close() {
if (mIsInitializing) throw new IllegalStateException("Closed during initialization"); if (mDatabase != null && mDatabase.isOpen()) {
mDatabase.close();
mDatabase = null;
}
} public SQLiteDatabase getWritableDatabase() {
synchronized (this) {
return getDatabaseLocked(true);
}
}
-- http://www.server110.com/sqlite/201403/8007.html
-- http://blog.csdn.net/sdsxleon/article/details/18259973
第二问题:如果insertByDto是定义在SQLiteOpenHelper继承类的外部,则getWritableDatabase()处无法通过编译,如果是在内部当你第一次执行getWritableDatabase()时,将调用oncreate()方法,而你在这里关闭了数据库,getWritableDatabase()无法返回数据库实例,报异常。如果你在oncreate()中掉close,getWritableDatabase()返回实例成功,你在返回的实例上进行close操作当然不会报异常。不知道我说明白没有。
第一次调用 getWritableDatabase或getReadableDatabase 会 调用 onCreate方法,onCreate里的DB不用关闭,否则getWritableDatabase 会报错。