diff --git a/src/com/activeandroid/TableInfo.java b/src/com/activeandroid/TableInfo.java index d58ceb479..32d1ecb3f 100644 --- a/src/com/activeandroid/TableInfo.java +++ b/src/com/activeandroid/TableInfo.java @@ -25,6 +25,7 @@ import java.util.Map; import android.text.TextUtils; +import android.util.Log; import com.activeandroid.annotation.Column; import com.activeandroid.annotation.Table; @@ -49,26 +50,33 @@ public TableInfo(Class type) { mType = type; final Table tableAnnotation = type.getAnnotation(Table.class); - if (tableAnnotation != null) { + + if (tableAnnotation != null) { mTableName = tableAnnotation.name(); mIdName = tableAnnotation.id(); } else { mTableName = type.getSimpleName(); - } + } - List fields = new LinkedList(ReflectionUtils.getDeclaredColumnFields(type)); - Collections.reverse(fields); + // Manually add the id column since it is not declared like the other columns. + Field idField = getIdField(type); + mColumnNames.put(idField, mIdName); - for (Field field : fields) { - final Column columnAnnotation = field.getAnnotation(Column.class); - String columnName = columnAnnotation.name(); - if (TextUtils.isEmpty(columnName)) { - columnName = field.getName(); - } + List fields = new LinkedList(ReflectionUtils.getDeclaredColumnFields(type)); + Collections.reverse(fields); - mColumnNames.put(field, columnName); - } + for (Field field : fields) { + if (field.isAnnotationPresent(Column.class)) { + final Column columnAnnotation = field.getAnnotation(Column.class); + String columnName = columnAnnotation.name(); + if (TextUtils.isEmpty(columnName)) { + columnName = field.getName(); + } + + mColumnNames.put(field, columnName); + } + } } @@ -95,4 +103,22 @@ public Collection getFields() { public String getColumnName(Field field) { return mColumnNames.get(field); } + + + private Field getIdField(Class type) { + if (type.equals(Model.class)) { + try { + return type.getDeclaredField("mId"); + } + catch (NoSuchFieldException e) { + Log.e("Impossible!", e.toString()); + } + } + else if (type.getSuperclass() != null) { + return getIdField(type.getSuperclass()); + } + + return null; + } + } diff --git a/src/com/activeandroid/util/SQLiteUtils.java b/src/com/activeandroid/util/SQLiteUtils.java index 541f8493d..9f64a7f16 100644 --- a/src/com/activeandroid/util/SQLiteUtils.java +++ b/src/com/activeandroid/util/SQLiteUtils.java @@ -148,6 +148,10 @@ public static void createUniqueColumnDefinition(TableInfo tableInfo, Field field final String name = tableInfo.getColumnName(field); final Column column = field.getAnnotation(Column.class); + if (field.getName().equals("mId")) { + return; + } + String[] groups = column.uniqueGroups(); ConflictAction[] conflictActions = column.onUniqueConflicts(); if (groups.length != conflictActions.length) @@ -196,6 +200,10 @@ public static void createIndexColumnDefinition(TableInfo tableInfo, Field field) final String name = tableInfo.getColumnName(field); final Column column = field.getAnnotation(Column.class); + if (field.getName().equals("mId")) { + return; + } + if (column.index()) { List list = new ArrayList(); list.add(name);