提交 c3cbc0fe 编写于 作者: G guolindev

Optimize TableModel find and remove ColumnModel mechanism. Use HashMap to speed up finding process.

上级 2b08ba45
......@@ -75,7 +75,7 @@ public abstract class AssociationCreator extends Generator {
* an auto increment id.
* @return A generated create table SQL.
*/
protected String generateCreateTableSQL(String tableName, List<ColumnModel> columnModels,
protected String generateCreateTableSQL(String tableName, Collection<ColumnModel> columnModels,
boolean autoIncrementId) {
StringBuilder createTableSQL = new StringBuilder("create table ");
createTableSQL.append(tableName).append(" (");
......@@ -429,10 +429,11 @@ public abstract class AssociationCreator extends Generator {
* List contains model fields.
* @return If ColumnModel list is empty or contains only id, _id field, return true. Otherwise return false.
*/
private boolean isContainsOnlyIdField(List<ColumnModel> columnModels) {
return columnModels.size() == 0
|| (columnModels.size() == 1 && isIdColumn(columnModels.get(0).getColumnName()))
|| (columnModels.size() == 2 && isIdColumn(columnModels.get(0).getColumnName()) && isIdColumn(columnModels.get(1).getColumnName()));
private boolean isContainsOnlyIdField(Collection<ColumnModel> columnModels) {
for (ColumnModel columnModel : columnModels) {
if (!columnModel.isIdColumn()) return false;
}
return true;
}
}
......@@ -86,8 +86,8 @@ public abstract class AssociationUpdater extends Creator {
*/
protected List<String> getForeignKeyColumns(TableModel tableModel) {
List<String> foreignKeyColumns = new ArrayList<String>();
List<ColumnModel> columnModelList = getTableModelFromDB(tableModel.getTableName()).getColumnModels();
for (ColumnModel columnModel : columnModelList) {
Collection<ColumnModel> columnModels = getTableModelFromDB(tableModel.getTableName()).getColumnModels();
for (ColumnModel columnModel : columnModels) {
String columnName = columnModel.getColumnName();
if (isForeignKeyColumnFormat(columnModel.getColumnName())) {
if (!tableModel.containsColumn(columnName)) {
......@@ -357,7 +357,7 @@ public abstract class AssociationUpdater extends Creator {
*/
protected String generateDataMigrationSQL(TableModel tableModel) {
String tableName = tableModel.getTableName();
List<ColumnModel> columnModels = tableModel.getColumnModels();
Collection<ColumnModel> columnModels = tableModel.getColumnModels();
if (!columnModels.isEmpty()) {
StringBuilder sql = new StringBuilder();
sql.append("insert into ").append(tableName).append("(");
......
......@@ -104,8 +104,8 @@ public class Upgrader extends AssociationUpdater {
* @return True if has new unique or not null column. False otherwise.
*/
private boolean hasNewUniqueOrNotNullColumn() {
List<ColumnModel> columnModelList = mTableModel.getColumnModels();
for (ColumnModel columnModel : columnModelList) {
Collection<ColumnModel> columnModels = mTableModel.getColumnModels();
for (ColumnModel columnModel : columnModels) {
if (columnModel.isIdColumn()) continue; // id don't check unique or nullable, we never upgrade it.
ColumnModel columnModelDB = mTableModelDB.getColumnModelByName(columnModel.getColumnName());
if (columnModel.isUnique()) {
......@@ -153,8 +153,8 @@ public class Upgrader extends AssociationUpdater {
private List<String> findColumnsToRemove() {
String tableName = mTableModel.getTableName();
List<String> removeColumns = new ArrayList<String>();
List<ColumnModel> columnModelList = mTableModelDB.getColumnModels();
for (ColumnModel columnModel : columnModelList) {
Collection<ColumnModel> columnModels = mTableModelDB.getColumnModels();
for (ColumnModel columnModel : columnModels) {
String dbColumnName = columnModel.getColumnName();
if (isNeedToRemove(dbColumnName)) {
removeColumns.add(dbColumnName);
......
......@@ -16,10 +16,9 @@
package org.litepal.tablemanager.model;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* This is a model class for tables. It stores a table name and a HashMap for
......@@ -36,9 +35,9 @@ public class TableModel {
private String tableName;
/**
* A list contains all column models with column name, type and constraints.
* A map contains all column models with column name, type and constraints.
*/
private List<ColumnModel> columnModels = new ArrayList<ColumnModel>();
private Map<String, ColumnModel> columnModelMap = new HashMap<>();
/**
* Class name for the table name. This value might be null. Don't rely on it.
......@@ -90,15 +89,15 @@ public class TableModel {
* A column model contains name, type and constraints.
*/
public void addColumnModel(ColumnModel columnModel) {
columnModels.add(columnModel);
columnModelMap.put(columnModel.getColumnName(), columnModel);
}
/**
* Find all the column models of the current table model.
* @return A list contains all column models.
*/
public List<ColumnModel> getColumnModels() {
return columnModels;
public Collection<ColumnModel> getColumnModels() {
return columnModelMap.values();
}
/**
......@@ -108,12 +107,7 @@ public class TableModel {
* @return A ColumnModel which can map the column name passed in. Or null.
*/
public ColumnModel getColumnModelByName(String columnName) {
for (ColumnModel columnModel : columnModels) {
if (columnModel.getColumnName().equalsIgnoreCase(columnName)) {
return columnModel;
}
}
return null;
return columnModelMap.get(columnName);
}
/**
......@@ -122,20 +116,7 @@ public class TableModel {
* Name of the column to remove.
*/
public void removeColumnModelByName(String columnName) {
if (TextUtils.isEmpty(columnName)) {
return;
}
int indexToRemove = -1;
for (int i = 0; i < columnModels.size(); i++) {
ColumnModel columnModel = columnModels.get(i);
if (columnName.equalsIgnoreCase(columnModel.getColumnName())) {
indexToRemove = i;
break;
}
}
if (indexToRemove != -1) {
columnModels.remove(indexToRemove);
}
columnModelMap.remove(columnName);
}
/**
......@@ -145,13 +126,7 @@ public class TableModel {
* @return True if matches a column in the table model. False otherwise.
*/
public boolean containsColumn(String columnName) {
for (int i = 0; i < columnModels.size(); i++) {
ColumnModel columnModel = columnModels.get(i);
if (columnName.equalsIgnoreCase(columnModel.getColumnName())) {
return true;
}
}
return false;
return columnModelMap.containsKey(columnName);
}
}
......@@ -35,6 +35,7 @@ import org.litepal.tablemanager.model.TableModel;
import org.litepal.util.DBUtility;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class TableStructureActivity extends AppCompatActivity {
......@@ -65,7 +66,7 @@ public class TableStructureActivity extends AppCompatActivity {
private void analyzeTableStructure() {
TableModel tableMode = DBUtility.findPragmaTableInfo(mTableName, Connector.getDatabase());
List<ColumnModel> columnModelList = tableMode.getColumnModels();
Collection<ColumnModel> columnModelList = tableMode.getColumnModels();
mList.addAll(columnModelList);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册