Android项目管理之数据库升级策略
16lz
2021-01-26
Android数据库升级策略
一:问题产生的一般原因
版本的升级引发以往的数据结构不能满足新的要求
新的数据表的不断引入
小版本迭代可能会导致数据库的频繁变更
二:目前常用的方案
方案:
每次更新数据库时,删除旧的数据,重新建表
避免使用复杂的数据表,采用json或者xml存储
对数据库的每次变更做记录,在升级时执行变更的记录
分析:
可以避免数据库变更对新版本程序的影响,但是用户数据会被清除,可以考虑将重要的数据存储到SharedPreference中去。
该方式避免的数据库变更可能产生的所有问题,但是整理上的性能和内存消耗会比较大。
该方式稍微复杂,但是是比较理想的解决方案,既避免了数据被清除掉,也避免了性能和内存消耗
三:本文讨论的方案
本文主要讨论二中的第三种方案,进行增量式数据变更
思路:
建立配置文件,存储数据库版本号,每次数据库变更的时候将该版本号+1
建立数据变更配置文件,每一行记录一个版本的数据变更
应用启动执行到自定义的SQLiteOpenHelper的public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 方法时,首先执行配置文件中的版本变更记录,然后执行onCreate()方法
实现:
DBHelper构造,传入配置文件中的数据库版本号
- privateDBHelper(Contextcontext,Stringname,CursorFactoryfactory,
- intversion){
- super(context,name,factory,version);
- }
create
- publicvoidonCreate(SQLiteDatabasedb){
- //这里建库时记得这样就好了CREATETABLEIFNOTEXISTS
- }
onUpgrade
- /**
- *数据库升级时,根据配置文件中的配置信息进行升级,可以涉及到添加字段,具体升级配置在res/raw/system.properties文件中定义
- */
- @Override
- publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
- executeLocalSQL(db);
- onCreate(db);
- }
executeLocalSQL
- /**
- *@Title:executeLocalSQL
- *@Description:执行本地SQL语句
- *@param设定文件
- *@returnvoid
- */
- privatevoidexecuteLocalSQL(SQLiteDatabasedb){
- ArrayList<String>sqlList=getLocalSQL();
- for(inti=0,l=sqlList.size();i<l;i++){
- try{
- db.execSQL(sqlList.get(i));
- }catch(Exceptione){
- Util.log(e.getMessage());
- }
- }
- }
获取本地数据变更记录
- privateArrayList<String>getLocalSQL(){
- ArrayList<String>result=newArrayList<String>();
- InputStreamis=null;
- InputStreamReaderreader=null;
- BufferedReaderbr=null;
- try{
- //is=Variable.appllicationContext.getResources().getAssets().open("dbchange.txt");
- is=Variable.appllicationContext.getResources().openRawResource(
- R.raw.alter);
- reader=newInputStreamReader(is);
- br=newBufferedReader(reader);
- Stringline=null;
- while((line=br.readLine())!=null){
- result.add(line);
- }
- }catch(FileNotFoundExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- Util.closeStream(br);
- Util.closeStream(reader);
- Util.closeStream(is);
- }
- returnresult;
- }
本文出自 “雨轩印象” 博客,转载请与作者联系!
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- 一句话锁定MySQL数据占用元凶
- 【译】Android中的安全数据-初始化向量
- Android中加密机制
- android之存储篇_SQLite数据库_让你彻底学会SQLite的使用
- Android(安卓)RecyclerView瀑布流布局添加Footer实现上拉加载
- Android视频编辑器(五)音频编解码、从视频中分离音频、音频混音、
- Android(安卓)开发神器系列(工具篇)之 Android(安卓)WiFi ADB
- Android分享笔记(3)Android(安卓)使用存放在存assets文件夹下的S