- ActiveAndroid的建表跟踪:
- ActiveAndroid扩展过的ContentProvider在Application创建的时候就会被创建,从而回调到onCreate()函数.
- onCreate()中调用了ActiveAndroid.initialize(getConfiguration())
- ActiveAndroid的initialize(…)会进一步调用到Cache.initialize(configuration).
- Cache的initialize(Configuration configuration)中会new DatabaseHelper(configuration)并赋给sDatabaseHelper, 而DatabaseHelper extends SQLiteOpenHelper.
- Cache的initialize(Configuration configuration)中还会调用openDatabase()->sDatabaseHelper.getWritableDatabase()
- 而DatabaseHelper的getWritableDatabase()就是基类SQLiteOpenHelper的getWritableDatabase(), 后者会调用进一步调用到getDatabaseLocked(boolean writable)这个函数,而这个函数会根据不同的情况来调用SQLiteOpenHelper的onConfigure(…)/onCreate(…)/onDowngrade(…)/onUpgrade()/onOpen()这些交由SQLiteOpenHelper的子类进行自定义操作的函数.
- 那么这里SQLiteOpenHelper的子类就是DatabaseHelper, 其自定义了上述的函数:
- onOpen(…) :
- executePragmas(db)
- onCreate(…)
- executePragmas(db)
- executeCreate(db)
- executeMigrations(db, -1, db.getVersion())
- executeCreateIndex(db)
- onUpgrade(…)
- executePragmas(db)
- executeCreate(db)
- executeMigrations(db, oldVersion, newVersion)
- onOpen(…) :
- executePragmas(…)的作用是,如果SQLiteUtils.FOREIGN_KEYS_SUPPORTED, 那么execSQL(“PRAGMA foreign_keys=ON;”)
- executeCreate(…)的作用是, 将所有注册为Sql表的Model代表的table创建一遍,为了提高效率,会使用transaction
- executeMigrations(…)的作用是, 就是根据当前版本号和要更新的版本号,获取升级需要的要执行的Sql语句文件,就是放在”migrations”目录下的那一堆.sql文件,会check AndroidManifest.xml中的db version, 根据版本号的差别来执行相应数量的.sql语句(比如现在是3, 当前是5, 那么会执行 4.sql 和 5.sql), 具体过程不细表
- 几个值得注意的点:
- executeCreate(…)中create table用的是CREATE TABLE IF NOT EXISTS, 即如果之前这个table在databse就已经存在,那么是不会重新创建的,这样就是为什么onUpgrade(…)中还会调用executeCreate(…)的原因,他会把新加的table自动替你create,而对于之前存在,但是有了变化的table,则是通过executeMigrations(…)来使变化生效的,即如果当前改动是完全新增一个table,那么是不需要在migrations的.sql文件中写出来的,ActiveAndroid会自动替你做了
- 默认对migrations文件的解析是executeLegacySqlScript(), 其处理逻辑是每次读取一行(Java Reader的readLine),将里面的”;”全部替换为”“, 然后执行将这一行的内容作为Sql语句来执行,因此如果在migrations文件中写的Sql语句太长而自己换行的话,在这里会因为sql语句的不完整(被断行执行了)而失败
- 当然也可以选择delimiter方式来断行: executeDelimitedSqlScript(…), Configuration.SQL_PARSER_DELIMITED.equalsIgnoreCase(mSqlParser)的情况下会被执行. SqlParser会把stream根据delimiter分割为一行一行的sql来执行, 具体如何分割则在SqlParser的parse(…)中
ActiveAndroid的建表跟踪
最新推荐文章于 2017-03-31 11:47:00 发布