Android数据库升级,数据迁移

版本迭代时难免需要对数据库字段进行增加,删除与修改操作。这时便需要对原有的数据进行迁移,以保证不丢失数据。对数据库的迁移我们需要做一下几个步骤:

  • 创建临时表,将原来的数据复制到临时表中。
  • 删除原表,原表数据已经备份至临时表中,不再需要,进行删除。
  • 创建新表,调用创建新表的方法,创建所有的新表。
  • 恢复原表的数据,将临时表中的数据恢复至新表中。
  • 删除临时表,完成所有的步骤。

具体步骤:

1.引入GreenDaoUpgradeHelper

compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.0.2'

2.在新建DaoManager类

public class DaoManager {

    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    private static volatile DaoManager mInstance = null;
    public static final String DATABASE_NAME = "greendao";

    private DaoManager(Context context) {

        MySQLiteOpenHelper helper = new MySQLiteOpenHelper(context, DATABASE_NAME, null);
        mDaoMaster = new DaoMaster(helper.getWritableDatabase());
       /* AppOpenHelper helper = new AppOpenHelper(CCApplication.getInstance().getApplicationContext(), DATABASE_NAME);
        Database db = helper.getWritableDb();
        mDaoMaster = new DaoMaster(db);*/
        mDaoSession = mDaoMaster.newSession();
    }

    public static DaoManager getInstance(Context context) {
        if (mInstance == null) {
            synchronized (DaoManager.class) {
                if (mInstance == null) {
                    mInstance = new DaoManager(context);
                }
            }
        }
        return mInstance;
    }

    public DaoMaster getMaster() {
        return mDaoMaster;
    }

    public DaoSession getSession() {
        return mDaoSession;
    }

    public DaoSession getNewSession() {
        mDaoSession = mDaoMaster.newSession();
        return mDaoSession;
    }

    /*private static class AppOpenHelper extends DaoMaster.OpenHelper {
        public AppOpenHelper(Context context, String name) {
            super(context, name);
        }

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

        @Override
        public void onUpgrade(Database db, int oldVersion, int newVersion) {
            DaoSession daoSession = new DaoMaster(db).newSession();
            // TODO: do something before recreate tables
            DaoMaster.dropAllTables(db, true);
            onCreate(db);
        }

        @Override
        public void onCreate(Database db) {
            Log.i("greenDAO", "Creating tables for schema version " + DaoMaster.SCHEMA_VERSION);
            DaoMaster.createAllTables(db, true);
        }
    }*/

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

        @Override
        public void onUpgrade(Database db, int oldVersion, int newVersion) {
            MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {

                @Override
                public void onCreateAllTables(Database db, boolean ifNotExists) {
                    DaoMaster.createAllTables(db, ifNotExists);
                }

                @Override
                public void onDropAllTables(Database db, boolean ifExists) {
                    DaoMaster.dropAllTables(db, ifExists);
                }
            },DBCurrentUserDao.class, DBCurrentUserSettingDao.class, DBTextChatMessageDao.class,RelationUserDao.class);
        }
    }
}

主要代码:

public class MySQLiteOpenHelper extends DaoMaster.OpenHelper {
    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }
    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {
        MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {

            @Override
            public void onCreateAllTables(Database db, boolean ifNotExists) {
                DaoMaster.createAllTables(db, ifNotExists);
            }

            @Override
            public void onDropAllTables(Database db, boolean ifExists) {
                DaoMaster.dropAllTables(db, ifExists);
            }
        },DBCurrentUserDao.class, DBCurrentUserSettingDao.class, DBTextChatMessageDao.class,RelationUserDao.class);
    }
}

sqlite升级--浅谈Android数据库版本升级及数据的迁移

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值