1.相关知识点:进程初始化顺序
进程初始化顺序:ContentProvider(即数据库) > Application > Service;
参考:https://www.jianshu.com/p/d52960e3f6f2
2.相关知识点:SQLiteOpenHelper 和 ContentProvider 关系
SQLiteOpenHelper 本身只是一个SQLite数据库实例,负责数据库的创建,是没有和进程绑定的生命周期的;
ContentProvider 是四大组件之一,生命周期被系统管理,它的作用是对数据库封装一层接口,对外提供该数据库的读写功能,SQLite数据库实例一般在ContentProvider.onCreate方法中创建;优点是统一数据库访问入口,避免对进程/多线程访问等问题。
3.数据库升级时,旧数据迁移/改造逻辑处理
主要是旧数据改造时机问题,数据库更新后数据修改分两种情况:
<一> 数据迁移
这种情况数据对数据库数据的整体改造,数据的修改需要在数据库初始化结束之前完成。
<二>数据修改
只需要修改布局数据。这种情况有两种时机来修改数据:
1. 在数据初始化结束之前完成(SQLiteOpenHelper.onUpgrade),这样的优点是在Application和Service等业务启动前完成数据修改,缺点是需要不能使用封装好的dao和manager类,因为dao是基于provider的,而provider是对DbHelper的封装;
2. 在 Service 初始化时处理,优点是使用dao和manager类操作数据方便,缺点是需要保证在对外提供这些数据之前完成修改;(一套逻辑满足云端下载地图和本地已有地图的更新,如果不考虑代码开发成本,一般建议统一使用第一中方式)