Search in sources :

Example 1 with TypeSerializer

use of com.activeandroid.serializer.TypeSerializer in project ActiveAndroid by pardom.

the class Model method save.

public final Long save() {
    final SQLiteDatabase db = Cache.openDatabase();
    final ContentValues values = new ContentValues();
    for (Field field : mTableInfo.getFields()) {
        final String fieldName = mTableInfo.getColumnName(field);
        Class<?> fieldType = field.getType();
        field.setAccessible(true);
        try {
            Object value = field.get(this);
            if (value != null) {
                final TypeSerializer typeSerializer = Cache.getParserForType(fieldType);
                if (typeSerializer != null) {
                    // serialize data
                    value = typeSerializer.serialize(value);
                    // set new object type
                    if (value != null) {
                        fieldType = value.getClass();
                        // check that the serializer returned what it promised
                        if (!fieldType.equals(typeSerializer.getSerializedType())) {
                            Log.w(String.format("TypeSerializer returned wrong type: expected a %s but got a %s", typeSerializer.getSerializedType(), fieldType));
                        }
                    }
                }
            }
            // can't know the type until runtime.
            if (value == null) {
                values.putNull(fieldName);
            } else if (fieldType.equals(Byte.class) || fieldType.equals(byte.class)) {
                values.put(fieldName, (Byte) value);
            } else if (fieldType.equals(Short.class) || fieldType.equals(short.class)) {
                values.put(fieldName, (Short) value);
            } else if (fieldType.equals(Integer.class) || fieldType.equals(int.class)) {
                values.put(fieldName, (Integer) value);
            } else if (fieldType.equals(Long.class) || fieldType.equals(long.class)) {
                values.put(fieldName, (Long) value);
            } else if (fieldType.equals(Float.class) || fieldType.equals(float.class)) {
                values.put(fieldName, (Float) value);
            } else if (fieldType.equals(Double.class) || fieldType.equals(double.class)) {
                values.put(fieldName, (Double) value);
            } else if (fieldType.equals(Boolean.class) || fieldType.equals(boolean.class)) {
                values.put(fieldName, (Boolean) value);
            } else if (fieldType.equals(Character.class) || fieldType.equals(char.class)) {
                values.put(fieldName, value.toString());
            } else if (fieldType.equals(String.class)) {
                values.put(fieldName, value.toString());
            } else if (fieldType.equals(Byte[].class) || fieldType.equals(byte[].class)) {
                values.put(fieldName, (byte[]) value);
            } else if (ReflectionUtils.isModel(fieldType)) {
                values.put(fieldName, ((Model) value).getId());
            } else if (ReflectionUtils.isSubclassOf(fieldType, Enum.class)) {
                values.put(fieldName, ((Enum<?>) value).name());
            }
        } catch (IllegalArgumentException e) {
            Log.e(e.getClass().getName(), e);
        } catch (IllegalAccessException e) {
            Log.e(e.getClass().getName(), e);
        }
    }
    if (mId == null) {
        mId = db.insert(mTableInfo.getTableName(), null, values);
    } else {
        db.update(mTableInfo.getTableName(), values, idName + "=" + mId, null);
    }
    Cache.getContext().getContentResolver().notifyChange(ContentProvider.createUri(mTableInfo.getType(), mId), null);
    return mId;
}
Also used : ContentValues(android.content.ContentValues) Field(java.lang.reflect.Field) SQLiteDatabase(android.database.sqlite.SQLiteDatabase) TypeSerializer(com.activeandroid.serializer.TypeSerializer)

Example 2 with TypeSerializer

use of com.activeandroid.serializer.TypeSerializer in project ActiveAndroid by pardom.

the class SQLiteUtils method createColumnDefinition.

@SuppressWarnings("unchecked")
public static String createColumnDefinition(TableInfo tableInfo, Field field) {
    StringBuilder definition = new StringBuilder();
    Class<?> type = field.getType();
    final String name = tableInfo.getColumnName(field);
    final TypeSerializer typeSerializer = Cache.getParserForType(field.getType());
    final Column column = field.getAnnotation(Column.class);
    if (typeSerializer != null) {
        type = typeSerializer.getSerializedType();
    }
    if (TYPE_MAP.containsKey(type)) {
        definition.append(name);
        definition.append(" ");
        definition.append(TYPE_MAP.get(type).toString());
    } else if (ReflectionUtils.isModel(type)) {
        definition.append(name);
        definition.append(" ");
        definition.append(SQLiteType.INTEGER.toString());
    } else if (ReflectionUtils.isSubclassOf(type, Enum.class)) {
        definition.append(name);
        definition.append(" ");
        definition.append(SQLiteType.TEXT.toString());
    }
    if (!TextUtils.isEmpty(definition)) {
        if (name.equals(tableInfo.getIdName())) {
            definition.append(" PRIMARY KEY AUTOINCREMENT");
        } else if (column != null) {
            if (column.length() > -1) {
                definition.append("(");
                definition.append(column.length());
                definition.append(")");
            }
            if (column.notNull()) {
                definition.append(" NOT NULL ON CONFLICT ");
                definition.append(column.onNullConflict().toString());
            }
            if (column.unique()) {
                definition.append(" UNIQUE ON CONFLICT ");
                definition.append(column.onUniqueConflict().toString());
            }
        }
        if (FOREIGN_KEYS_SUPPORTED && ReflectionUtils.isModel(type)) {
            definition.append(" REFERENCES ");
            definition.append(Cache.getTableInfo((Class<? extends Model>) type).getTableName());
            definition.append("(" + tableInfo.getIdName() + ")");
            definition.append(" ON DELETE ");
            definition.append(column.onDelete().toString().replace("_", " "));
            definition.append(" ON UPDATE ");
            definition.append(column.onUpdate().toString().replace("_", " "));
        }
    } else {
        Log.e("No type mapping for: " + type.toString());
    }
    return definition.toString();
}
Also used : Column(com.activeandroid.annotation.Column) TypeSerializer(com.activeandroid.serializer.TypeSerializer) String(java.lang.String)

Example 3 with TypeSerializer

use of com.activeandroid.serializer.TypeSerializer in project ActiveAndroid by pardom.

the class ModelInfo method scanForModelClasses.

private void scanForModelClasses(File path, String packageName, ClassLoader classLoader) {
    if (path.isDirectory()) {
        for (File file : path.listFiles()) {
            scanForModelClasses(file, packageName, classLoader);
        }
    } else {
        String className = path.getName();
        // Robolectric fallback
        if (!path.getPath().equals(className)) {
            className = path.getPath();
            if (className.endsWith(".class")) {
                className = className.substring(0, className.length() - 6);
            } else {
                return;
            }
            className = className.replace(System.getProperty("file.separator"), ".");
            int packageNameIndex = className.lastIndexOf(packageName);
            if (packageNameIndex < 0) {
                return;
            }
            className = className.substring(packageNameIndex);
        }
        try {
            Class<?> discoveredClass = Class.forName(className, false, classLoader);
            if (ReflectionUtils.isModel(discoveredClass)) {
                @SuppressWarnings("unchecked") Class<? extends Model> modelClass = (Class<? extends Model>) discoveredClass;
                mTableInfos.put(modelClass, new TableInfo(modelClass));
            } else if (ReflectionUtils.isTypeSerializer(discoveredClass)) {
                TypeSerializer instance = (TypeSerializer) discoveredClass.newInstance();
                mTypeSerializers.put(instance.getDeserializedType(), instance);
            }
        } catch (ClassNotFoundException e) {
            Log.e("Couldn't create class.", e);
        } catch (InstantiationException e) {
            Log.e("Couldn't instantiate TypeSerializer.", e);
        } catch (IllegalAccessException e) {
            Log.e("IllegalAccessException", e);
        }
    }
}
Also used : TypeSerializer(com.activeandroid.serializer.TypeSerializer) DexFile(dalvik.system.DexFile) File(java.io.File)

Example 4 with TypeSerializer

use of com.activeandroid.serializer.TypeSerializer in project ActiveAndroid by pardom.

the class ModelInfo method loadModelFromMetaData.

//////////////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
//////////////////////////////////////////////////////////////////////////////////////
private boolean loadModelFromMetaData(Configuration configuration) {
    if (!configuration.isValid()) {
        return false;
    }
    final List<Class<? extends Model>> models = configuration.getModelClasses();
    if (models != null) {
        for (Class<? extends Model> model : models) {
            mTableInfos.put(model, new TableInfo(model));
        }
    }
    final List<Class<? extends TypeSerializer>> typeSerializers = configuration.getTypeSerializers();
    if (typeSerializers != null) {
        for (Class<? extends TypeSerializer> typeSerializer : typeSerializers) {
            try {
                TypeSerializer instance = typeSerializer.newInstance();
                mTypeSerializers.put(instance.getDeserializedType(), instance);
            } catch (InstantiationException e) {
                Log.e("Couldn't instantiate TypeSerializer.", e);
            } catch (IllegalAccessException e) {
                Log.e("IllegalAccessException", e);
            }
        }
    }
    return true;
}
Also used : TypeSerializer(com.activeandroid.serializer.TypeSerializer)

Example 5 with TypeSerializer

use of com.activeandroid.serializer.TypeSerializer in project ActiveAndroid by pardom.

the class Model method loadFromCursor.

// Model population
public final void loadFromCursor(Cursor cursor) {
    /**
         * Obtain the columns ordered to fix issue #106 (https://github.com/pardom/ActiveAndroid/issues/106)
         * when the cursor have multiple columns with same name obtained from join tables.
         */
    List<String> columnsOrdered = new ArrayList<String>(Arrays.asList(cursor.getColumnNames()));
    for (Field field : mTableInfo.getFields()) {
        final String fieldName = mTableInfo.getColumnName(field);
        Class<?> fieldType = field.getType();
        final int columnIndex = columnsOrdered.indexOf(fieldName);
        if (columnIndex < 0) {
            continue;
        }
        field.setAccessible(true);
        try {
            boolean columnIsNull = cursor.isNull(columnIndex);
            TypeSerializer typeSerializer = Cache.getParserForType(fieldType);
            Object value = null;
            if (typeSerializer != null) {
                fieldType = typeSerializer.getSerializedType();
            }
            // can't know the type until runtime.
            if (columnIsNull) {
                field = null;
            } else if (fieldType.equals(Byte.class) || fieldType.equals(byte.class)) {
                value = cursor.getInt(columnIndex);
            } else if (fieldType.equals(Short.class) || fieldType.equals(short.class)) {
                value = cursor.getInt(columnIndex);
            } else if (fieldType.equals(Integer.class) || fieldType.equals(int.class)) {
                value = cursor.getInt(columnIndex);
            } else if (fieldType.equals(Long.class) || fieldType.equals(long.class)) {
                value = cursor.getLong(columnIndex);
            } else if (fieldType.equals(Float.class) || fieldType.equals(float.class)) {
                value = cursor.getFloat(columnIndex);
            } else if (fieldType.equals(Double.class) || fieldType.equals(double.class)) {
                value = cursor.getDouble(columnIndex);
            } else if (fieldType.equals(Boolean.class) || fieldType.equals(boolean.class)) {
                value = cursor.getInt(columnIndex) != 0;
            } else if (fieldType.equals(Character.class) || fieldType.equals(char.class)) {
                value = cursor.getString(columnIndex).charAt(0);
            } else if (fieldType.equals(String.class)) {
                value = cursor.getString(columnIndex);
            } else if (fieldType.equals(Byte[].class) || fieldType.equals(byte[].class)) {
                value = cursor.getBlob(columnIndex);
            } else if (ReflectionUtils.isModel(fieldType)) {
                final long entityId = cursor.getLong(columnIndex);
                final Class<? extends Model> entityType = (Class<? extends Model>) fieldType;
                Model entity = Cache.getEntity(entityType, entityId);
                if (entity == null) {
                    entity = new Select().from(entityType).where(idName + "=?", entityId).executeSingle();
                }
                value = entity;
            } else if (ReflectionUtils.isSubclassOf(fieldType, Enum.class)) {
                @SuppressWarnings("rawtypes") final Class<? extends Enum> enumType = (Class<? extends Enum>) fieldType;
                value = Enum.valueOf(enumType, cursor.getString(columnIndex));
            }
            // Use a deserializer if one is available
            if (typeSerializer != null && !columnIsNull) {
                value = typeSerializer.deserialize(value);
            }
            // Set the field value
            if (value != null) {
                field.set(this, value);
            }
        } catch (IllegalArgumentException e) {
            Log.e(e.getClass().getName(), e);
        } catch (IllegalAccessException e) {
            Log.e(e.getClass().getName(), e);
        } catch (SecurityException e) {
            Log.e(e.getClass().getName(), e);
        }
    }
    if (mId != null) {
        Cache.addEntity(this);
    }
}
Also used : ArrayList(java.util.ArrayList) Field(java.lang.reflect.Field) TypeSerializer(com.activeandroid.serializer.TypeSerializer) Select(com.activeandroid.query.Select)

Aggregations

TypeSerializer (com.activeandroid.serializer.TypeSerializer)5 Field (java.lang.reflect.Field)2 ContentValues (android.content.ContentValues)1 SQLiteDatabase (android.database.sqlite.SQLiteDatabase)1 Column (com.activeandroid.annotation.Column)1 Select (com.activeandroid.query.Select)1 DexFile (dalvik.system.DexFile)1 File (java.io.File)1 String (java.lang.String)1 ArrayList (java.util.ArrayList)1