提交 511a7485 编写于 作者: G guolindev

Handle the situation for changing index annotation on fields or add new...

Handle the situation for changing index annotation on fields or add new columns with index annotation.
上级 014b708e
......@@ -125,15 +125,7 @@ public abstract class AssociationCreator extends Generator {
List<String> sqls = new ArrayList<>();
for (ColumnModel columnModel : columnModels) {
if (columnModel.hasIndex()) {
StringBuilder createIndexSQL = new StringBuilder("create index ");
createIndexSQL.append(DBUtility.getIndexNameByColumnName(columnModel.getColumnName()));
createIndexSQL.append(" on ");
createIndexSQL.append(tableName);
createIndexSQL.append(" (");
createIndexSQL.append(columnModel.getColumnName());
createIndexSQL.append(")");
sqls.add(createIndexSQL.toString());
LitePalLog.d(TAG, "create table index sql is >> " + createIndexSQL);
sqls.add(generateCreateIndexSQL(tableName, columnModel));
}
}
return sqls;
......@@ -188,6 +180,30 @@ public abstract class AssociationCreator extends Generator {
return addColumnSQL.toString();
}
/**
* Generate create index SQL by the passed in parameters.
*
* @param tableName
* The table name.
* @param columnModel
* Column model with column info.
* @return A generated create index SQL.
*/
protected String generateCreateIndexSQL(String tableName, ColumnModel columnModel) {
StringBuilder createIndexSQL = new StringBuilder();
if (columnModel.hasIndex()) {
createIndexSQL.append("create index ");
createIndexSQL.append(DBUtility.getIndexName(tableName, columnModel.getColumnName()));
createIndexSQL.append(" on ");
createIndexSQL.append(tableName);
createIndexSQL.append(" (");
createIndexSQL.append(columnModel.getColumnName());
createIndexSQL.append(")");
LitePalLog.d(TAG, "create table index sql is >> " + createIndexSQL);
}
return createIndexSQL.toString();
}
/**
* Judge the passed in column is a foreign key column format or not. Each
* column name ends with _id will be considered as foreign key column
......
......@@ -140,7 +140,7 @@ public abstract class AssociationUpdater extends Creator {
*/
protected void dropTables(List<String> dropTableNames, SQLiteDatabase db) {
if (dropTableNames != null && !dropTableNames.isEmpty()) {
List<String> dropTableSQLS = new ArrayList<String>();
List<String> dropTableSQLS = new ArrayList<>();
for (int i = 0; i < dropTableNames.size(); i++) {
dropTableSQLS.add(generateDropTableSQL(dropTableNames.get(i)));
}
......@@ -185,7 +185,7 @@ public abstract class AssociationUpdater extends Creator {
deleteData.append("=").append(" lower('").append(tableName).append("')");
}
LitePalLog.d(TAG, "clear table schema value sql is " + deleteData);
List<String> sqls = new ArrayList<String>();
List<String> sqls = new ArrayList<>();
sqls.add(deleteData.toString());
execute(sqls, mDb);
}
......@@ -243,7 +243,7 @@ public abstract class AssociationUpdater extends Creator {
* @return The foreign key columns need to remove in a list.
*/
private List<String> findForeignKeyToRemove(TableModel tableModel) {
List<String> removeRelations = new ArrayList<String>();
List<String> removeRelations = new ArrayList<>();
List<String> foreignKeyColumns = getForeignKeyColumns(tableModel);
String selfTableName = tableModel.getTableName();
for (String foreignKeyColumn : foreignKeyColumns) {
......@@ -266,7 +266,7 @@ public abstract class AssociationUpdater extends Creator {
* @return A list with all intermediate join tables to drop.
*/
private List<String> findIntermediateTablesToDrop() {
List<String> intermediateTables = new ArrayList<String>();
List<String> intermediateTables = new ArrayList<>();
for (String tableName : DBUtility.findAllTableNames(mDb)) {
if (DBUtility.isIntermediateTable(tableName, mDb)) {
boolean dropIntermediateTable = true;
......@@ -298,15 +298,16 @@ public abstract class AssociationUpdater extends Creator {
* @return A list with all generic tables to drop.
*/
private List<String> findGenericTablesToDrop() {
List<String> genericTablesToDrop = new ArrayList<String>();
List<String> genericTablesToDrop = new ArrayList<>();
for (String tableName : DBUtility.findAllTableNames(mDb)) {
if (DBUtility.isGenericTable(tableName, mDb)) {
boolean dropGenericTable = true;
for (GenericModel genericModel : getGenericModels()) {
String genericTableName = genericModel.getTableName();
if (tableName.equalsIgnoreCase(genericTableName)) {
dropGenericTable = false;
}
if (tableName.equalsIgnoreCase(genericTableName)) {
dropGenericTable = false;
break;
}
}
if (dropGenericTable) {
// drop the generic table
......@@ -429,7 +430,7 @@ public abstract class AssociationUpdater extends Creator {
LitePalLog.d(TAG, "generateRemoveColumnSQL >> " + dataMigrationSQL);
String dropTempTableSQL = generateDropTempTableSQL(tableName);
LitePalLog.d(TAG, "generateRemoveColumnSQL >> " + dropTempTableSQL);
List<String> sqls = new ArrayList<String>();
List<String> sqls = new ArrayList<>();
sqls.add(alterToTempTableSQL);
sqls.add(createNewTableSQL);
sqls.add(dataMigrationSQL);
......
......@@ -128,7 +128,7 @@ public class Upgrader extends AssociationUpdater {
* @return List with ColumnModel contains information of new columns.
*/
private List<ColumnModel> findColumnsToAdd() {
List<ColumnModel> columnsToAdd = new ArrayList<ColumnModel>();
List<ColumnModel> columnsToAdd = new ArrayList<>();
for (ColumnModel columnModel : mTableModel.getColumnModels()) {
String columnName = columnModel.getColumnName();
if (!mTableModelDB.containsColumn(columnName)) {
......@@ -152,7 +152,7 @@ public class Upgrader extends AssociationUpdater {
*/
private List<String> findColumnsToRemove() {
String tableName = mTableModel.getTableName();
List<String> removeColumns = new ArrayList<String>();
List<String> removeColumns = new ArrayList<>();
Collection<ColumnModel> columnModels = mTableModelDB.getColumnModels();
for (ColumnModel columnModel : columnModels) {
String dbColumnName = columnModel.getColumnName();
......@@ -173,7 +173,7 @@ public class Upgrader extends AssociationUpdater {
* @return A list contains all ColumnModel which type are changed from database.
*/
private List<ColumnModel> findColumnTypesToChange() {
List<ColumnModel> columnsToChangeType = new ArrayList<ColumnModel>();
List<ColumnModel> columnsToChangeType = new ArrayList<>();
for (ColumnModel columnModelDB : mTableModelDB.getColumnModels()) {
for (ColumnModel columnModel : mTableModel.getColumnModels()) {
if (columnModelDB.getColumnName().equalsIgnoreCase(columnModel.getColumnName())) {
......@@ -189,8 +189,9 @@ public class Upgrader extends AssociationUpdater {
// for reducing loops, check column constraints change here.
LitePalLog.d(TAG, "default value db is:" + columnModelDB.getDefaultValue() + ", default value is:" + columnModel.getDefaultValue());
if (columnModelDB.isNullable() != columnModel.isNullable() ||
!columnModelDB.getDefaultValue().equalsIgnoreCase(columnModel.getDefaultValue()) ||
(columnModelDB.isUnique() && !columnModel.isUnique())) { // unique constraint can not be added
!columnModelDB.getDefaultValue().equalsIgnoreCase(columnModel.getDefaultValue()) ||
columnModelDB.hasIndex() != columnModel.hasIndex() ||
(columnModelDB.isUnique() && !columnModel.isUnique())) { // unique constraint can not be added
hasConstraintChanged = true;
}
}
......@@ -235,8 +236,13 @@ public class Upgrader extends AssociationUpdater {
* Which contains column info.
* @return A SQL to add new column.
*/
private String generateAddColumnSQL(ColumnModel columnModel) {
return generateAddColumnSQL(mTableModel.getTableName(), columnModel);
private List<String> generateAddColumnSQLs(ColumnModel columnModel) {
List<String> sqls = new ArrayList<>();
sqls.add(generateAddColumnSQL(mTableModel.getTableName(), columnModel));
if (columnModel.hasIndex()) {
sqls.add(generateCreateIndexSQL(mTableModel.getTableName(), columnModel));
}
return sqls;
}
/**
......@@ -248,9 +254,9 @@ public class Upgrader extends AssociationUpdater {
* @return A SQL list contains add all new columns job.
*/
private List<String> getAddColumnSQLs(List<ColumnModel> columnModelList) {
List<String> sqls = new ArrayList<String>();
List<String> sqls = new ArrayList<>();
for (ColumnModel columnModel : columnModelList) {
sqls.add(generateAddColumnSQL(columnModel));
sqls.addAll(generateAddColumnSQLs(columnModel));
}
return sqls;
}
......@@ -294,7 +300,7 @@ public class Upgrader extends AssociationUpdater {
*/
private void changeColumnsType(List<ColumnModel> columnModelList) {
LitePalLog.d(TAG, "do changeColumnsType");
List<String> columnNames = new ArrayList<String>();
List<String> columnNames = new ArrayList<>();
if (columnModelList != null && !columnModelList.isEmpty()) {
for (ColumnModel columnModel : columnModelList) {
columnNames.add(columnModel.getColumnName());
......@@ -326,12 +332,14 @@ public class Upgrader extends AssociationUpdater {
List<String> addForeignKeySQLs = generateAddForeignKeySQL();
String dataMigrationSQL = generateDataMigrationSQL(mTableModelDB);
String dropTempTableSQL = generateDropTempTableSQL(mTableModel.getTableName());
List<String> sqls = new ArrayList<String>();
List<String> createIndexSQL = generateCreateIndexSQLs(mTableModel);
List<String> sqls = new ArrayList<>();
sqls.add(alterToTempTableSQL);
sqls.add(createNewTableSQL);
sqls.addAll(addForeignKeySQLs);
sqls.add(dataMigrationSQL);
sqls.add(dropTempTableSQL);
sqls.addAll(createIndexSQL);
LitePalLog.d(TAG, "generateChangeConstraintSQL >> ");
for (String sql : sqls) {
LitePalLog.d(TAG, sql);
......@@ -347,7 +355,7 @@ public class Upgrader extends AssociationUpdater {
* @return A SQL List for adding foreign keys.
*/
private List<String> generateAddForeignKeySQL() {
List<String> addForeignKeySQLs = new ArrayList<String>();
List<String> addForeignKeySQLs = new ArrayList<>();
List<String> foreignKeyColumns = getForeignKeyColumns(mTableModel);
for (String foreignKeyColumn : foreignKeyColumns) {
if (!mTableModel.containsColumn(foreignKeyColumn)) {
......
......@@ -83,34 +83,18 @@ public class DBUtility {
return null;
}
/**
* Get the column name by index name.
* In LitePal index name always named like columnName_index.
* So split the index name by underscore and take the first one.
* @param indexName
* Index name with right rule.
* @return Column name or null if index name is not right.
*/
public static String getColumnNameByIndexName(String indexName) {
if (!TextUtils.isEmpty(indexName)) {
String[] nameArray = indexName.split("_");
if (nameArray.length == 2) {
return nameArray[0];
}
}
return null;
}
/**
* Get the index name by column name.
* In LitePal index name always named like columnName_index.
* @param tableName
* Table name.
* @param columnName
* Column name.
* @return Index name or null if column name is null or empty.
*/
public static String getIndexNameByColumnName(String columnName) {
if (!TextUtils.isEmpty(columnName)) {
return columnName + "_index";
public static String getIndexName(String tableName, String columnName) {
if (!TextUtils.isEmpty(tableName) && !TextUtils.isEmpty(columnName)) {
return tableName + "_" + columnName + "_index";
}
return null;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册