问个有关SQLiteOpenHelper的奇怪的有关问题

问个有关SQLiteOpenHelper的奇怪的问题
@Override
public void onCreate(SQLiteDatabase database) {
String createTable = "create table note(id integer primary key,title text,content text,time text);";
database.close();// 在这里把SQLiteDatabase 关闭了
}

public void insertByDto(Note note) {
SQLiteDatabase db = getWritableDatabase();// 这里报了SQLiteDatabaseLockedException
ContentValues values = new ContentValues();
values.put("title", note.getTitle());
values.put("content", note.getContent());
values.put("time", CommonUtil.getTime());
db.insert("note", null, values);
db.close();
}

但是如果我把onCreate里的database.close()去掉,就不报异常了。
问题是即便我在onCreate里面没有调用database.close(),但insertByDto里面也调用了db.close(),为什么就不会报异常呢?
------解决方案--------------------
为何在onCreate里面 创建表以后 就把 数据库关掉呢,你关掉了 再去操作数据库应该是无法成功的。
------解决方案--------------------
SQLiteOpenHelper 这个每次调用的时候 都会实例化,所以关闭后 ,你再调用就不会有错。
------解决方案--------------------
源码
    /**
     * 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);
        }
    }
------解决方案--------------------
这种异常 一般是 多线程 读写数据库 出现 不同步的问题; 

把这个 SQLiteOpenHelper 设置成单例模式,  访问数据库的接口都加上 synchronized 同步锁, 

参考 : 
-- http://www.server110.com/sqlite/201403/8007.html
-- http://blog.csdn.net/sdsxleon/article/details/18259973

------解决方案--------------------
第一问题:SQLiteOpenHelper的onCreate方法是在数据库第一次创建时执行的,而你在这里没有创建任何的表单。你在插入数据时都会报异常;
第二问题:如果insertByDto是定义在SQLiteOpenHelper继承类的外部,则getWritableDatabase()处无法通过编译,如果是在内部当你第一次执行getWritableDatabase()时,将调用oncreate()方法,而你在这里关闭了数据库,getWritableDatabase()无法返回数据库实例,报异常。如果你在oncreate()中掉close,getWritableDatabase()返回实例成功,你在返回的实例上进行close操作当然不会报异常。不知道我说明白没有。
------解决方案--------------------
引用:
第一问题:SQLiteOpenHelper的onCreate方法是在数据库第一次创建时执行的,而你在这里没有创建任何的表单。你在插入数据时都会报异常;
第二问题:如果insertByDto是定义在SQLiteOpenHelper继承类的外部,则getWritableDatabase()处无法通过编译,如果是在内部当你第一次执行getWritableDatabase()时,将调用oncreate()方法,而你在这里关闭了数据库,getWritableDatabase()无法返回数据库实例,报异常。如果你在oncreate()中掉close,getWritableDatabase()返回实例成功,你在返回的实例上进行close操作当然不会报异常。不知道我说明白没有。

是的
第一次调用 getWritableDatabase或getReadableDatabase 会 调用 onCreate方法,onCreate里的DB不用关闭,否则getWritableDatabase 会报错。