Android数据库升级策略


一:问题产生的一般原因
版本的升级引发以往的数据结构不能满足新的要求
新的数据表的不断引入
小版本迭代可能会导致数据库的频繁变更
二:目前常用的方案
方案:
每次更新数据库时,删除旧的数据,重新建表
避免使用复杂的数据表,采用json或者xml存储
对数据库的每次变更做记录,在升级时执行变更的记录
分析:
可以避免数据库变更对新版本程序的影响,但是用户数据会被清除,可以考虑将重要的数据存储到SharedPreference中去。
该方式避免的数据库变更可能产生的所有问题,但是整理上的性能和内存消耗会比较大。
该方式稍微复杂,但是是比较理想的解决方案,既避免了数据被清除掉,也避免了性能和内存消耗
三:本文讨论的方案
本文主要讨论二中的第三种方案,进行增量式数据变更
思路:
建立配置文件,存储数据库版本号,每次数据库变更的时候将该版本号+1
建立数据变更配置文件,每一行记录一个版本的数据变更
应用启动执行到自定义的SQLiteOpenHelper的public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 方法时,首先执行配置文件中的版本变更记录,然后执行onCreate()方法
实现:
DBHelper构造,传入配置文件中的数据库版本号

        
  1. privateDBHelper(Contextcontext,Stringname,CursorFactoryfactory,
  2. intversion){
  3. super(context,name,factory,version);
  4. }


create

        
  1. publicvoidonCreate(SQLiteDatabasedb){
  2. //这里建库时记得这样就好了CREATETABLEIFNOTEXISTS
  3. }


onUpgrade

        
  1. /**
  2. *数据库升级时,根据配置文件中的配置信息进行升级,可以涉及到添加字段,具体升级配置在res/raw/system.properties文件中定义
  3. */
  4. @Override
  5. publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
  6. executeLocalSQL(db);
  7. onCreate(db);
  8. }


executeLocalSQL

        
  1. /**
  2. *@Title:executeLocalSQL
  3. *@Description:执行本地SQL语句
  4. *@param设定文件
  5. *@returnvoid
  6. */
  7. privatevoidexecuteLocalSQL(SQLiteDatabasedb){
  8. ArrayList<String>sqlList=getLocalSQL();
  9. for(inti=0,l=sqlList.size();i<l;i++){
  10. try{
  11. db.execSQL(sqlList.get(i));
  12. }catch(Exceptione){
  13. Util.log(e.getMessage());
  14. }
  15. }
  16. }


获取本地数据变更记录

        
  1. privateArrayList<String>getLocalSQL(){
  2. ArrayList<String>result=newArrayList<String>();
  3. InputStreamis=null;
  4. InputStreamReaderreader=null;
  5. BufferedReaderbr=null;
  6. try{
  7. //is=Variable.appllicationContext.getResources().getAssets().open("dbchange.txt");
  8. is=Variable.appllicationContext.getResources().openRawResource(
  9. R.raw.alter);
  10. reader=newInputStreamReader(is);
  11. br=newBufferedReader(reader);
  12. Stringline=null;
  13. while((line=br.readLine())!=null){
  14. result.add(line);
  15. }
  16. }catch(FileNotFoundExceptione){
  17. e.printStackTrace();
  18. }catch(IOExceptione){
  19. e.printStackTrace();
  20. }finally{
  21. Util.closeStream(br);
  22. Util.closeStream(reader);
  23. Util.closeStream(is);
  24. }
  25. returnresult;
  26. }

本文出自 “雨轩印象” 博客,转载请与作者联系!

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. 【译】Android中的安全数据-初始化向量
  4. Android中加密机制
  5. android之存储篇_SQLite数据库_让你彻底学会SQLite的使用
  6. Android(安卓)RecyclerView瀑布流布局添加Footer实现上拉加载
  7. Android视频编辑器(五)音频编解码、从视频中分离音频、音频混音、
  8. Android(安卓)开发神器系列(工具篇)之 Android(安卓)WiFi ADB
  9. Android分享笔记(3)Android(安卓)使用存放在存assets文件夹下的S

随机推荐

  1. Actvity中TextView的Touch事件
  2. 使用异步任务下载--疯狂android讲义实例
  3. andriod中的ImageView显示的几种方式
  4. 交互式实例
  5. Gradle version 与 Android(安卓)Plugin
  6. Volley的四大请求
  7. Android(安卓)xml Activity进入或退出动
  8. 从TikTok事件,聊聊如何用内容煽动情绪
  9. recycleview二级菜单列表
  10. com.android.build.api.transform.Transf