diff --git a/src/com/activeandroid/Model.java b/src/com/activeandroid/Model.java index 421426ea3..c34706976 100644 --- a/src/com/activeandroid/Model.java +++ b/src/com/activeandroid/Model.java @@ -30,7 +30,9 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; @SuppressWarnings("unchecked") public abstract class Model { @@ -46,6 +48,9 @@ public abstract class Model { private final TableInfo mTableInfo; private final String idName; + private static Map> columnIndexesCache = new HashMap>(); + private static Map> fieldTypesCache = new HashMap>(); + ////////////////////////////////////////////////////////////////////////////////////// // CONSTRUCTORS ////////////////////////////////////////////////////////////////////////////////////// @@ -79,7 +84,9 @@ public final Long save() { final String fieldName = mTableInfo.getColumnName(field); Class fieldType = field.getType(); - field.setAccessible(true); + if (!field.isAccessible()) { + field.setAccessible(true); + } try { Object value = field.get(this); @@ -183,16 +190,39 @@ public final void loadFromCursor(Cursor cursor) { * when the cursor have multiple columns with same name obtained from join tables. */ List columnsOrdered = new ArrayList(Arrays.asList(cursor.getColumnNames())); + List columnIndexes = columnIndexesCache.get(mTableInfo.getTableName()); + if (columnIndexes == null) { + columnIndexes = new ArrayList(); + columnIndexesCache.put(mTableInfo.getTableName(), columnIndexes); + } + List fieldTypes = fieldTypesCache.get(mTableInfo.getTableName()); + if (fieldTypes == null) { + fieldTypes = new ArrayList(); + fieldTypesCache.put(mTableInfo.getTableName(), fieldTypes); + } + int counter = 0; for (Field field : mTableInfo.getFields()) { - final String fieldName = mTableInfo.getColumnName(field); - Class fieldType = field.getType(); - final int columnIndex = columnsOrdered.indexOf(fieldName); + final int columnIndex; + Class fieldType; + if (columnIndexes.size() <= counter) { + String fieldName = mTableInfo.getColumnName(field); + columnIndex = columnsOrdered.indexOf(fieldName); + columnIndexes.add(columnIndex); + + fieldType = field.getType(); + fieldTypes.add(fieldType); + } else { + columnIndex = columnIndexes.get(counter); + fieldType = fieldTypes.get(counter); + } if (columnIndex < 0) { continue; } - field.setAccessible(true); + if (!field.isAccessible()) { + field.setAccessible(true); + } try { boolean columnIsNull = cursor.isNull(columnIndex); @@ -264,6 +294,8 @@ else if (ReflectionUtils.isSubclassOf(fieldType, Enum.class)) { if (value != null) { field.set(this, value); } + + counter++; } catch (IllegalArgumentException e) { Log.e(e.getClass().getName(), e);