30
30
import java .lang .reflect .Field ;
31
31
import java .util .ArrayList ;
32
32
import java .util .Arrays ;
33
+ import java .util .HashMap ;
33
34
import java .util .List ;
35
+ import java .util .Map ;
34
36
35
37
@ SuppressWarnings ("unchecked" )
36
38
public abstract class Model {
@@ -46,6 +48,8 @@ public abstract class Model {
46
48
47
49
private final TableInfo mTableInfo ;
48
50
private final String idName ;
51
+ private static Map <String , List <Integer >> columnIndexesCache = new HashMap <String , List <Integer >>();
52
+
49
53
//////////////////////////////////////////////////////////////////////////////////////
50
54
// CONSTRUCTORS
51
55
//////////////////////////////////////////////////////////////////////////////////////
@@ -185,10 +189,23 @@ public final void loadFromCursor(Cursor cursor) {
185
189
* when the cursor have multiple columns with same name obtained from join tables.
186
190
*/
187
191
List <String > columnsOrdered = new ArrayList <String >(Arrays .asList (cursor .getColumnNames ()));
192
+ List <Integer > columnIndexes = columnIndexesCache .get (mTableInfo .getTableName ());
193
+ if (columnIndexes == null ) {
194
+ columnIndexes = new ArrayList <Integer >();
195
+ columnIndexesCache .put (mTableInfo .getTableName (), columnIndexes );
196
+ }
197
+ int counter = 0 ;
188
198
for (Field field : mTableInfo .getFields ()) {
189
- final String fieldName = mTableInfo .getColumnName (field );
190
199
Class <?> fieldType = field .getType ();
191
- final int columnIndex = columnsOrdered .indexOf (fieldName );
200
+
201
+ final int columnIndex ;
202
+ if (columnIndexes .size () <= counter ) {
203
+ String fieldName = mTableInfo .getColumnName (field );
204
+ columnIndex = columnsOrdered .indexOf (fieldName );
205
+ columnIndexes .add (columnIndex );
206
+ } else {
207
+ columnIndex = columnIndexes .get (counter );
208
+ }
192
209
193
210
if (columnIndex < 0 ) {
194
211
continue ;
@@ -268,6 +285,8 @@ else if (ReflectionUtils.isSubclassOf(fieldType, Enum.class)) {
268
285
if (value != null ) {
269
286
field .set (this , value );
270
287
}
288
+
289
+ counter ++;
271
290
}
272
291
catch (IllegalArgumentException e ) {
273
292
Log .e (e .getClass ().getName (), e );
0 commit comments