greendao数据库升级

来源:互联网 发布:资金互助软件 编辑:程序博客网 时间:2024/05/01 21:27

数据库升级,例如数据添加一列,greendao操作步骤:

1.生成类GreenDaoGenerator中,修改数据库版本号

//第一个参数3为数据库的版本号Schema schema = new Schema(3, "cn.hulutek.budd.resmanager.resmanagerdb.model");

修改数据库变更的实体类

Entity myaudios = schema.addEntity("MyAudios");        myaudios.addIdProperty().primaryKey().autoincrement();myaudios.addBooleanProperty("bookmarked");myaudios.addBooleanProperty("audioadded");myaudios.addStringProperty("song_name");myaudios.addStringProperty("chinese_name");//下面这行为新增的数据库字段myaudios.addStringProperty("foreign_name");myaudios.addStringProperty("tibetan_name");myaudios.addStringProperty("song_other_name");myaudios.addStringProperty("song_path");

run GreenDaoGenerator,生成新的代码

2.DaoMaster中,

 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");            //数据库升级时,创建新的数据库,迁移数据到新的数据库            for(int i=oldVersion;i<=newVersion;i++){               MigrationHelper.getInstance().migrate(db,MyAudiosDao.class,MyScriptureDao.class,MyTributeDao.class);            }           /* dropAllTables(db, true);            onCreate(db);*/        }    }

至此,数据库升级成功

其中,MigrationHelper.java

package cn.hulutek.budd.resmanager.resmanagerdb.dao;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.text.TextUtils;import android.util.Log;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import de.greenrobot.dao.AbstractDao;import de.greenrobot.dao.internal.DaoConfig;/** * Created by Administrator on 2016/4/18. */public class MigrationHelper {    private static final String CONVERSION_CLASS_NOT_FOUND_EXCEPTION = "MIGRATION HELPER - CLASS DOESN'T MATCH WITH THE CURRENT PARAMETERS";    private static MigrationHelper instance;    public static MigrationHelper getInstance() {        if(instance == null) {            instance = new MigrationHelper();        }        return instance;    }    public void migrate(SQLiteDatabase db, Class<? extends AbstractDao<?, ?>>... daoClasses) {        generateTempTables(db, daoClasses);        DaoMaster.dropAllTables(db, true);        DaoMaster.createAllTables(db, false);        restoreData(db, daoClasses);    }    private void generateTempTables(SQLiteDatabase db, Class<? extends AbstractDao<?, ?>>... daoClasses) {        for(int i = 0; i < daoClasses.length; i++) {            DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]);            String divider = "";            String tableName = daoConfig.tablename;            String tempTableName = daoConfig.tablename.concat("_TEMP");            ArrayList<String> properties = new ArrayList<>();            StringBuilder createTableStringBuilder = new StringBuilder();            createTableStringBuilder.append("CREATE TABLE ").append(tempTableName).append(" (");            for(int j = 0; j < daoConfig.properties.length; j++) {                String columnName = daoConfig.properties[j].columnName;                if((getColumns(db, tableName)).contains(columnName)) {                    properties.add(columnName);                    String type = null;                    try {                        type = getTypeByClass(daoConfig.properties[j].type);                    } catch (Exception exception) {                        Crashlytics.logException(exception);                    }                    createTableStringBuilder.append(divider).append(columnName).append(" ").append(type);                    if(daoConfig.properties[j].primaryKey) {                        createTableStringBuilder.append(" PRIMARY KEY");                    }                    divider = ",";                }            }            createTableStringBuilder.append(");");            db.execSQL(createTableStringBuilder.toString());            StringBuilder insertTableStringBuilder = new StringBuilder();            insertTableStringBuilder.append("INSERT INTO ").append(tempTableName).append(" (");            insertTableStringBuilder.append(TextUtils.join(",", properties));            insertTableStringBuilder.append(") SELECT ");            insertTableStringBuilder.append(TextUtils.join(",", properties));            insertTableStringBuilder.append(" FROM ").append(tableName).append(";");            db.execSQL(insertTableStringBuilder.toString());        }    }    private void restoreData(SQLiteDatabase db, Class<? extends AbstractDao<?, ?>>... daoClasses) {        for(int i = 0; i < daoClasses.length; i++) {            DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]);            String tableName = daoConfig.tablename;            String tempTableName = daoConfig.tablename.concat("_TEMP");            ArrayList<String> properties = new ArrayList();            for (int j = 0; j < daoConfig.properties.length; j++) {                String columnName = daoConfig.properties[j].columnName;                if(getColumns(db, tempTableName).contains(columnName)) {                    properties.add(columnName);                }            }            StringBuilder insertTableStringBuilder = new StringBuilder();            insertTableStringBuilder.append("INSERT INTO ").append(tableName).append(" (");            insertTableStringBuilder.append(TextUtils.join(",", properties));            insertTableStringBuilder.append(") SELECT ");            insertTableStringBuilder.append(TextUtils.join(",", properties));            insertTableStringBuilder.append(" FROM ").append(tempTableName).append(";");            StringBuilder dropTableStringBuilder = new StringBuilder();            dropTableStringBuilder.append("DROP TABLE ").append(tempTableName);            db.execSQL(insertTableStringBuilder.toString());            db.execSQL(dropTableStringBuilder.toString());        }    }    private String getTypeByClass(Class<?> type) throws Exception {        if(type.equals(String.class)) {            return "TEXT";        }        if(type.equals(Long.class) || type.equals(Integer.class) || type.equals(long.class)) {            return "INTEGER";        }        if(type.equals(Boolean.class)) {            return "BOOLEAN";        }        Exception exception = new Exception(CONVERSION_CLASS_NOT_FOUND_EXCEPTION.concat(" - Class: ").concat(type.toString()));        Crashlytics.logException(exception);        throw exception;    }    private static List<String> getColumns(SQLiteDatabase db, String tableName) {        List<String> columns = new ArrayList<>();        Cursor cursor = null;        try {            cursor = db.rawQuery("SELECT * FROM " + tableName + " limit 1", null);            if (cursor != null) {                columns = new ArrayList<>(Arrays.asList(cursor.getColumnNames()));            }        } catch (Exception e) {            Log.v(tableName, e.getMessage(), e);            e.printStackTrace();        } finally {            if (cursor != null)                cursor.close();        }        return columns;    }}
0 0