Last active
October 12, 2019 19:20
-
-
Save KidusMT/a7b603ebb01b08d9b12c8cdddd438b9b to your computer and use it in GitHub Desktop.
Got this file from https://github.com/yuweiguocn/GreenDaoUpgradeHelper/blob/master/library/src/main/java/com/github/yuweiguocn/library/greendao/MigrationHelper.java and from this answer on stackoverflow https://stackoverflow.com/a/30334668/6021740
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.content.Context; | |
import android.database.Cursor; | |
import android.database.sqlite.SQLiteDatabase; | |
import android.text.TextUtils; | |
import android.util.Log; | |
import androidx.annotation.NonNull; | |
import org.greenrobot.greendao.AbstractDao; | |
import org.greenrobot.greendao.database.Database; | |
import org.greenrobot.greendao.database.StandardDatabase; | |
import org.greenrobot.greendao.internal.DaoConfig; | |
import java.lang.reflect.InvocationTargetException; | |
import java.lang.reflect.Method; | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
import java.util.List; | |
public class MigrationHelper extends DaoMaster.OpenHelper { | |
public MigrationHelper(Context context, String name) { | |
super(context, name); | |
} | |
public static void migrate(SQLiteDatabase sqliteDatabase, Class<? extends AbstractDao<?, ?>>... daoClasses) { | |
StandardDatabase db = new StandardDatabase(sqliteDatabase); | |
generateNewTablesIfNotExists(db, daoClasses); | |
generateTempTables(db, daoClasses); | |
dropAllTables(db, true, daoClasses); | |
createAllTables(db, false, daoClasses); | |
restoreData(db, daoClasses); | |
} | |
public static void migrate(StandardDatabase db, Class<? extends AbstractDao<?, ?>>... daoClasses) { | |
generateNewTablesIfNotExists(db, daoClasses); | |
generateTempTables(db, daoClasses); | |
dropAllTables(db, true, daoClasses); | |
createAllTables(db, false, daoClasses); | |
restoreData(db, daoClasses); | |
} | |
private static void generateNewTablesIfNotExists(StandardDatabase db, Class<? extends AbstractDao<?, ?>>... daoClasses) { | |
reflectMethod(db, "createTable", true, daoClasses); | |
} | |
private static void generateTempTables(StandardDatabase 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"); | |
StringBuilder insertTableStringBuilder = new StringBuilder(); | |
insertTableStringBuilder.append("CREATE TEMP TABLE ").append(tempTableName); | |
insertTableStringBuilder.append(" AS SELECT * FROM ").append(tableName).append(";"); | |
db.execSQL(insertTableStringBuilder.toString()); | |
} | |
} | |
private static void dropAllTables(StandardDatabase db, boolean ifExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) { | |
reflectMethod(db, "dropTable", ifExists, daoClasses); | |
} | |
private static void createAllTables(StandardDatabase db, boolean ifNotExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) { | |
reflectMethod(db, "createTable", ifNotExists, daoClasses); | |
} | |
/** | |
* dao class already define the sql exec method, so just invoke it | |
*/ | |
private static void reflectMethod(StandardDatabase db, String methodName, boolean isExists, @NonNull Class<? extends AbstractDao<?, ?>>... daoClasses) { | |
if (daoClasses.length < 1) { | |
return; | |
} | |
try { | |
for (Class cls : daoClasses) { | |
Method method = cls.getDeclaredMethod(methodName, Database.class, boolean.class); | |
method.invoke(null, db, isExists); | |
} | |
} catch (NoSuchMethodException e) { | |
e.printStackTrace(); | |
} catch (InvocationTargetException e) { | |
e.printStackTrace(); | |
} catch (IllegalAccessException e) { | |
e.printStackTrace(); | |
} | |
} | |
private static void restoreData(StandardDatabase 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"); | |
// get all columns from tempTable, take careful to use the columns list | |
List<String> columns = getColumns(db, tempTableName); | |
ArrayList<String> properties = new ArrayList<>(columns.size()); | |
for (int j = 0; j < daoConfig.properties.length; j++) { | |
String columnName = daoConfig.properties[j].columnName; | |
if (columns.contains(columnName)) { | |
properties.add(columnName); | |
} | |
} | |
if (properties.size() > 0) { | |
final String columnSQL = TextUtils.join(",", properties); | |
StringBuilder insertTableStringBuilder = new StringBuilder(); | |
insertTableStringBuilder.append("INSERT INTO ").append(tableName).append(" ("); | |
insertTableStringBuilder.append(columnSQL); | |
insertTableStringBuilder.append(") SELECT "); | |
insertTableStringBuilder.append(columnSQL); | |
insertTableStringBuilder.append(" FROM ").append(tempTableName).append(";"); | |
db.execSQL(insertTableStringBuilder.toString()); | |
} | |
StringBuilder dropTableStringBuilder = new StringBuilder(); | |
dropTableStringBuilder.append("DROP TABLE ").append(tempTableName); | |
db.execSQL(dropTableStringBuilder.toString()); | |
} | |
} | |
private static List<String> getColumns(StandardDatabase db, String tableName) { | |
List<String> columns = null; | |
Cursor cursor = null; | |
try { | |
cursor = db.rawQuery("SELECT * FROM " + tableName + " limit 0", null); | |
if (null != cursor && cursor.getColumnCount() > 0) { | |
columns = Arrays.asList(cursor.getColumnNames()); | |
} | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} finally { | |
if (cursor != null) | |
cursor.close(); | |
if (null == columns) | |
columns = new ArrayList<>(); | |
} | |
return columns; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment