Android数据库升级策略

Android数据库升级策略


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

 
 
  1. private DBHelper(Context context, String name, CursorFactory factory,
  2. int version) {
  3. super(context, name, factory, version);
  4. }


create

 
 
  1. public void onCreate(SQLiteDatabase db) {
  2. //这里建库时记得这样就好了CREATE TABLE IF NOT EXISTS
  3. }


onUpgrade

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


executeLocalSQL

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


获取本地数据变更记录

 
 
  1. private ArrayList<String> getLocalSQL() {
  2. ArrayList<String> result = new ArrayList<String>();
  3. InputStream is = null;
  4. InputStreamReader reader = null;
  5. BufferedReader br = null;
  6. try {
  7. // is = Variable.appllicationContext.getResources().getAssets().open("dbchange.txt");
  8. is = Variable.appllicationContext.getResources().openRawResource(
  9. R.raw.alter);
  10. reader = new InputStreamReader(is);
  11. br = new BufferedReader(reader);
  12. String line = null;
  13. while((line = br.readLine()) !=null){
  14. result.add(line);
  15. }
  16. } catch (FileNotFoundException e) {
  17. e.printStackTrace();
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }finally{
  21. Util.closeStream(br);
  22. Util.closeStream(reader);
  23. Util.closeStream(is);
  24. }
  25. return result;
  26. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值