ActiveAndroid的建表跟踪

  1. 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, 其自定义了上述的函数:
      1. onOpen(…) :
        • executePragmas(db)
      2. onCreate(…)
        • executePragmas(db)
        • executeCreate(db)
        • executeMigrations(db, -1, db.getVersion())
        • executeCreateIndex(db)
      3. onUpgrade(…)
        • executePragmas(db)
        • executeCreate(db)
        • executeMigrations(db, oldVersion, newVersion)
    • 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(…)中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值