GreenDao设置数据库路径以及数据库升级

本文详细介绍了在Android开发中使用GreenDao时如何设置数据库路径,以及APP上线后如何优雅地进行数据库升级,避免数据丢失。通过重写`UpgradeHelper`实现自定义升级过程,并探讨了数据迁移的两种策略:逐级版本迭代升级和全量备份恢复。同时,提供了判断表存在、创建临时表等关键SQL操作,帮助开发者更好地管理和维护数据库。
摘要由CSDN通过智能技术生成

1. APP开发期间的数据库

上一篇文章中封装了GreenDaoManager中有个构造方法如下:

private GreenDaoManager(){
        if (mInstance == null) {
//            DaoMaster.DevOpenHelper devOpenHelper = new
//                    DaoMaster.DevOpenHelper(MyApplication.getContext(), "database_name", null);//此处openhelper为自动生成开发所使用,发布版本需自定义
            MySQLiteOpenHelper devOpenHelper = new
                    MySQLiteOpenHelper(new GreenDaoContext(), "database_name.db", null);//GreenDaoContext为创建数据库路径使用
            mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
            mDaoSession = mDaoMaster.newSession();
        }
    }

其中注释掉的两行代码中:

DaoMaster.DevOpenHelper devOpenHelper = new
DaoMaster.DevOpenHelper(MyApplication.getContext(), "database_name", null);//此处DevOpenHelper 为自动生成开发所使用,发布版本需自定义

其中的MyApplication.getContext()上下文表示了数据库存储路径为手机内存。这里的DevOpenHelper即为DaoMaster中自动生成代码,完整代码如下:

/** * WARNING: Drops all table on Upgrade! Use only during development. */
public static class DevOpenHelper extends OpenHelper {
       
  public DevOpenHelper(Context context, String name, CursorFactory factory) {
             super(context, name, factory);    
  }    
  @Override    
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {            
        Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");        
        dropAllTables(db, true);        
        onCreate(db);    
  }
}

注意看第一行注释:WARNING: Drops all table on Upgrade! Use only during development.
数据库升级的话,会删除所有表,然后重新创建。这种方式在开发期间,APP还没有上线之前是可以的。

当APP上线后,我们不能使用这种方式,因为这样会导致已经存在的数据会被删除。

2. APP上线后,数据库升级

我们需要重写一个类MySQLiteOpenHelper实现OpenHelper.
1. 需要自己实现了onUpgrade方法来自定义升级过程。
2. 当然升级过程中也要修改DaoMaster.SCHEMA_VERSION
3. 当DaoMaster.SCHEMA_VERSION跟你当前数据库的版本比较后,会根据你当前数据库的版本,然后进行升级。
4. 关键代码onUpgrade方法,会比较新数据库和旧数据库的版本,然后执行相应的sql升级:

public class MySQLiteOpenHelper extends DaoMaster.OpenHelper  {
   
    public MySQLiteOpenHelper(Context context, String name) {
        super(context, name);
    }

    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //数据迁移模块
        MigrationHelper.migrate(db,
                UserDao.class,
                ProfessionDao.class,
                LTestDao.class);
    }
}

数据库升级不外乎两种情况:
  1.修改表结构。
  2.添加新表。

针对onUpgrade中的实现方法可以采用两种不同策略:(稍后都会提供两种策略的代码实现,下面主要讲述第二种数据迁移实现方式)
 1.逐级版本迭代升级,比如当前版本为1,最新版本为3,此方案就是先从1–>2–>3.
 2.把数据库中的数据备份,然后全删数据库,再重新创建新的数据库,把备份数据导入。此方案直接从1–>3。

3. 数据迁移(数据库备份)的具体实现

  1. android上面对的数据库基本上就是轻量级数据库sqlite,首先我们需要了解一些后面需要用到的数据库操作语句:
    • 判断sqlite表是否存在
      SELECT * FROM sqlite_master WHERE type='table' AND name='tempTableName&
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值