我们在平常项目中难免会碰到这样的情况,比如我想在用户表中增加一个字段,来采集用户行为信息。比较常规的做法可能就是,重新测试打包上架,然后提示用户更新app。但是如果用户不更新呢?这样我们就无法采集到这个字段,另外重新打包上架的时间成本也是昂贵的,往往会导致用户的流失。那么有没有一种方法,类似于热修复,在用户无感知的情况下完成这样的数据库表升级呢?其实目前比较主流的做法就是配置xml文件的方式,用户只需要下载xml文件解析,然后执行sql语句即可。sql语句的执行流程分为4个步骤:
- 备份数据库表(重命名)
- 新建数据库表
- 将备份表内容拷贝到新表中
- 删除备份表
一、xml配置
下面对几个xml节点进行讲解。
1、updateXml
xml的根节点。通过对它的解析拿到document对象
2、updateStep
这个节点你可以配置多个,也就是版本不同,执行的语句也可能不同。但是不建议这样使用,因为这样会增加我们在解析xml的时候内存的压力。说不定就GG了。所以正确的做法应该是针对不同的版本我们去请求服务器,服务器返回不同的xml文件。
(1)versionFrom:起始版本,也就是用户的版本,可以是单个,也可是多个。比如"V0001,V0003"。意思就是将0001和0003版本都升级到 0002
(2)versionTo:目标版本,也就是服务器上的版本。
3、updateDb
这个节点也可以配置多个,主要存放数据库执行的sql语句。
二、xml解析
1、解析根节点
2、解析updateStep
3、解析updateDb
三、开始更新
新建工具类UpdateManager。
1、入口方法
遍历updateStep列表,然后检查用户版本是否符合当前版本
2、版本检查
一般情况下用户的数据库表版本存放在sp或者单独的数据库表中。
3、获取当前版本的数据库更新语句
4、开始更新
首先拿到要操作的数据库,为了语句格式的正确,需要去除换行,然后执行语句。
5、结果
增加了一个carAge字段信息,并且原来的数据没有丢失。