当前位置:   article > 正文

Android SQLite 数据库不丢失数据自动升级流程_升级sqlite表结构

升级sqlite表结构

       正常我们在开发中经常会遇到sqlite数据库升级的问题,比如增加字段/删除字段/表结构重构等等,随着apk版本的升高,不同版本可能需要对数据库进行修改,但是要求是数据库升级不能影响用户的已存数据,所以今天就来看看数据库升级流程是怎样的。

目录

SQLiteDatabase源码调用流程

数据库自动升级流程


  • SQLiteDatabase源码调用流程

  1. 首先我们需要继承 SQLiteOpenHelper, 下面是 SQLiteOpenHelper 的源码注释:
SQLiteOpenHelper is a helper class to manage database creation and version management.

然后会提示让我们去重写他的三个方法:

  1. public SQLiteOpenHelper(@Nullable Context context, @Nullable String name,
  2. @Nullable CursorFactory factory, int version) {
  3. this(context, name, factory, version, null);
  4. // 传入我们的数据库名称 和 版本号version
  5. }
  6. @Override
  7. public void onCreate(SQLiteDatabase db) {
  8. // 创建表
  9. }
  10. @Override
  11. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  12. // 版本升级
  13. }

       2. 分析以下上述三个方法调用的时机,何时会被调用。

  1. 构造方法--首先我们创建数据库操作类的时候先走构造方法,通过构造方法会把数据库名称和版本号 传 SQLiteOpenHelper
    当然这只是创建了,数据库操作类,数据库还没有创建。
  2. onCreate() 方法是创建表的,只有第一次才会走这个方法,首次创建数据库的时候才会走,之后就不会走了。
  3. onUpgrade()数据库升级,这个方法只有构造方法中传的版本号发生了升级才会走,所以我们升级的逻辑就在这里处理。

                    以上只是常用的方法,还有数据库降级等等方法按需重写。

       3. 方法调用的源码流程图

根据这个流程图配合我们的源码更容易理解 sqlite 整个创建流程,这就是整个数据库版本检测和获得db的过程。对整个流程熟悉了之后,接下来我们就好理解数据库升级。

  • 数据库自动升级流程

对于升级我们就举一个例子,从db version 1 升级到db version 2的过程: 

  1. 假如我们的表结构是这样的
  2. * version = 1;
  3. * auto integer REAL REAL
  4. * _id color loc_x loc_y
  5. * version = 2; 添加了一个 字段 time
  6. * auto integer REAL REAL REAL
  7. * _id color loc_x loc_y time

通过分析源码我们知道数据库升级是在 onUpgrade() 方法中的,接下来分析升级流程:

  1. 创建临时缓存表 用于缓存老表里面的数据
  2. 查询老表中的数据并且把数据插入到缓存的表中去
  3. 删除老表,创建新的表结构
  4. 把缓存表数据重新插入到新的表结构中去
  5. 调用查询,插入检测是否升级成功
  6. 升级结束

整个流程就这些,接下来把升级的代码贴上,特别要注意的是升级的流程要放到子线程中去!

  1. @Override
  2. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  3. //创建临时缓存表 用于缓存老表里面的数据
  4. String createTable = "CREATE TABLE " + snapCachedTableName
  5. + " (" + CustomColorEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
  6. + CustomColorEntry.COLUMN_NAME_COLOR + " INTEGER,"
  7. + CustomColorEntry.COLUMN_NAME_LOCX + " REAL,"
  8. + CustomColorEntry.COLUMN_NAME_LOCY + " REAL)";
  9. db.execSQL(createTable);
  10. //查询所有的老表数据
  11. List<CustomColor> colors = getCustomColors(CustomColorEntry.TABLE_NAME,db);
  12. //把数据插入到缓存的表中去
  13. for (CustomColor color : colors){
  14. insertCustomColor(color, snapCachedTableName,db);
  15. }
  16. db.execSQL("drop table " + CustomColorEntry.TABLE_NAME);
  17. //创建新的表结构
  18. String createNewTable = "CREATE TABLE " + CustomColorEntry.TABLE_NAME
  19. + " (" + CustomColorEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
  20. + CustomColorEntry.COLUMN_NAME_COLOR + " INTEGER,"
  21. + CustomColorEntry.COLUMN_NAME_LOCX + " REAL,"
  22. + CustomColorEntry.COLUMN_NAME_LOCY + " REAL,"
  23. + CustomColorEntry.COLUMN_NAME_TIME + " REAL)";
  24. db.execSQL(createNewTable);
  25. //查询所有的缓存表中的数据
  26. List<CustomColor> cachedColors = getCustomColors(snapCachedTableName,db);
  27. //把数据插入到新的表中去
  28. for (CustomColor color : cachedColors){
  29. insertCustomColor(color, CustomColorEntry.TABLE_NAME,db);
  30. }
  31. db.execSQL("drop table " + snapCachedTableName);
  32. }

传送门github:https://github.com/WangRain1/DbUpgradeDemo 大家给点支持,笑嘻嘻

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/267266
推荐阅读
相关标签
  

闽ICP备14008679号