为何在onCreate里面 创建表以后 就把 数据库关掉呢,你关掉了 再去操作数据库应该是无法成功的。

解决方案 »

  1.   


    那为什么 insertByDto里面把 数据库关掉后下次还能操作呢?
      

  2.   

    SQLiteOpenHelper 这个每次调用的时候 都会实例化,所以关闭后 ,你再调用就不会有错。
      

  3.   

    源码
        /**
         * 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);
            }
        }
      

  4.   

    这种异常 一般是 多线程 读写数据库 出现 不同步的问题; 把这个 SQLiteOpenHelper 设置成单例模式,  访问数据库的接口都加上 synchronized 同步锁, 参考 : 
    -- http://www.server110.com/sqlite/201403/8007.html
    -- http://blog.csdn.net/sdsxleon/article/details/18259973
      

  5.   

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

  6.   

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