今天在做数据库升级的时候,遇到一个问题,就是onCreate方法和onUpgrade方法的执行时机的问题,这个当时在操作的时候,没有弄清楚,很是迷糊,所以写代码的时候出现了很多的问题,所以没办法就去扒源代码看了。不过在此之前我讲解过一篇关于数据库升级的文章,但是那里没有详细的讲解一下这两个方法的执行时机,所以这里就在单独说一下
关于数据库升级的文章:http://blog.csdn.net/jiangwei0910410003/article/details/39670813
不多说,下面直接进入主题吧:
首先我们看看SQLiteOpenHelper类的源码:
它里面有一个重要的方法:getDatabaseLocked
这里我们看到当我们的mName变量为null的时候,就会创建一个内存数据库,数据的生命周期是Application级别的,这个mName就是创建数据库的文件名。
当然正常情况下,我们都会传入一个数据库文件名的,所以这个方法一般不会执行的,那么就走下面的代码。下面的代码就是直接打开一个数据库。不过我们看到一个特点,就是创建数据库和Context有关系呢。我们看一下Context中的代码。不过这里我们知道Context是一个抽象类,我们一般会看他的子类ContextImpl实现:
主要看一下getDatabasePath方法和openOrCreateDatabase方法:
首先来看一下openOrCreateDatabase方法:
@Overridepublic SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler) { File f = validateFilePath(name, true); int flags = SQLiteDatabase.CREATE_IF_NECESSARY; if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0)