From 101015934a95ee7d639285105d3252186c7c9963 Mon Sep 17 00:00:00 2001 From: yuweiguocn Date: Fri, 4 Nov 2016 16:10:12 +0800 Subject: [PATCH] fix issue #8 #9 --- README.md | 2 +- README_CH.md | 2 +- library/build.gradle | 4 +- .../library/greendao/MigrationHelper.java | 93 +++++++++++-------- 4 files changed, 59 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 15176fd..4749a22 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ GreenDaoUpgradeHelper is a database upgrade helper for greenDao.Use GreenDaoUpgr ``` dependencies { compile 'org.greenrobot:greendao:3.2.0' - compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.1.0' + compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.2.0' } ``` or (greendao 3.0 below) diff --git a/README_CH.md b/README_CH.md index e09c6ce..dd56a9e 100644 --- a/README_CH.md +++ b/README_CH.md @@ -20,7 +20,7 @@ GreenDaoUpgradeHelper是一个greenDao的数据库升级帮助类。使用它可 ``` dependencies { compile 'org.greenrobot:greendao:3.2.0' - compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.1.0' + compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.2.0' } ``` 如果你使用的greendao是3.0以前的版本,请使用下面的依赖: diff --git a/library/build.gradle b/library/build.gradle index f189673..b0806ed 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -7,8 +7,8 @@ android { defaultConfig { minSdkVersion 8 targetSdkVersion 23 - versionCode 110 - versionName "1.1" + versionCode 120 + versionName "1.2" } buildTypes { release { diff --git a/library/src/main/java/com/github/yuweiguocn/library/greendao/MigrationHelper.java b/library/src/main/java/com/github/yuweiguocn/library/greendao/MigrationHelper.java index 4a50c4b..4ad626c 100644 --- a/library/src/main/java/com/github/yuweiguocn/library/greendao/MigrationHelper.java +++ b/library/src/main/java/com/github/yuweiguocn/library/greendao/MigrationHelper.java @@ -1,6 +1,7 @@ package com.github.yuweiguocn.library.greendao; import android.database.Cursor; +import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.support.annotation.NonNull; import android.text.TextUtils; @@ -51,17 +52,27 @@ public static void migrate(SQLiteDatabase db, Class> private static void generateTempTables(Database db, Class>... 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 TEMPORARY TABLE ").append(tempTableName); - insertTableStringBuilder.append(" AS SELECT * FROM ").append(tableName).append(";"); - db.execSQL(insertTableStringBuilder.toString()); - if (DEBUG) { - Log.d(TAG, "【Table】" + tableName +"\n ---Columns-->"+getColumnsStr(daoConfig)); - Log.d(TAG, "【Generate temp table】" + tempTableName); + String tempTableName = null; + try { + DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]); + String tableName = daoConfig.tablename; + tempTableName = daoConfig.tablename.concat("_TEMP"); + + StringBuilder dropTableStringBuilder = new StringBuilder(); + dropTableStringBuilder.append("DROP TABLE IF EXISTS ").append(tempTableName).append(";"); + db.execSQL(dropTableStringBuilder.toString()); + + StringBuilder insertTableStringBuilder = new StringBuilder(); + insertTableStringBuilder.append("CREATE TEMPORARY TABLE ").append(tempTableName); + insertTableStringBuilder.append(" AS SELECT * FROM ").append(tableName).append(";"); + db.execSQL(insertTableStringBuilder.toString()); + if (DEBUG) { + Log.d(TAG, "【Table】" + tableName +"\n ---Columns-->"+getColumnsStr(daoConfig)); + Log.d(TAG, "【Generate temp table】" + tempTableName); + } + } catch (SQLException e) { + Log.e(TAG, "【Failed to generate temp table】" + tempTableName, e); } } } @@ -119,37 +130,43 @@ private static void reflectMethod(Database db, String methodName, boolean isExis private static void restoreData(Database db, Class>... 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 columns = getColumns(db, tempTableName); - ArrayList 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); + String tempTableName = null; + + try { + DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]); + String tableName = daoConfig.tablename; + tempTableName = daoConfig.tablename.concat("_TEMP"); + // get all columns from tempTable, take careful to use the columns list + List columns = getColumns(db, tempTableName); + ArrayList 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()); + 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()); + if (DEBUG) { + Log.d(TAG, "【Restore data】 to " + tableName); + } + } + StringBuilder dropTableStringBuilder = new StringBuilder(); + dropTableStringBuilder.append("DROP TABLE ").append(tempTableName); + db.execSQL(dropTableStringBuilder.toString()); if (DEBUG) { - Log.d(TAG, "【Restore data】 to " + tableName); + Log.d(TAG, "【Drop temp table】" + tempTableName); } - } - StringBuilder dropTableStringBuilder = new StringBuilder(); - dropTableStringBuilder.append("DROP TABLE ").append(tempTableName); - db.execSQL(dropTableStringBuilder.toString()); - if (DEBUG) { - Log.d(TAG, "【Drop temp table】" + tempTableName); + } catch (SQLException e) { + Log.e(TAG, "【Failed to restore data from temp table (probably new table)】" + tempTableName, e); } } }