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. 数据迁移(数据库备份)的具体实现
- android上面对的数据库基本上就是轻量级数据库
sqlite
,首先我们需要了解一些后面需要用到的数据库操作语句:
- 判断
sqlite
表是否存在
SELECT * FROM sqlite_master WHERE type='table' AND name='tempTableName&
- 判断