package com.jdroid.android.sqlite; import android.content.ContentValues; import android.database.Cursor; import com.jdroid.android.utils.AndroidEncryptionUtils; import com.jdroid.java.collections.Lists; import com.jdroid.java.json.JSONObject; import com.jdroid.java.http.parser.json.JsonParser; import com.jdroid.java.date.DateTimeFormat; import com.jdroid.java.date.DateUtils; import com.jdroid.java.utils.StringUtils; import java.util.Date; import java.util.List; import java.util.Map; public enum DataType { TEXT("TEXT") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, (String)value); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public String readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } return cursor.getString(columnIndex); } }, INTEGER("INTEGER") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, ((Number)value).intValue()); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public Integer readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } return cursor.getInt(columnIndex); } }, LONG("INTEGER") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, ((Number) value).longValue()); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public Long readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } return cursor.getLong(columnIndex); } }, DOUBLE("REAL") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, ((Number) value).doubleValue()); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public Double readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } return cursor.getDouble(columnIndex); } }, FLOAT("REAL") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, ((Number) value).floatValue()); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public Float readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } return cursor.getFloat(columnIndex); } }, BLOB("BLOB") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, (byte[])value); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public byte[] readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } return cursor.getBlob(columnIndex); } }, BOOLEAN("INTEGER") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, ((Boolean) value) ? 1 : 0); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public Boolean readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } return cursor.getInt(columnIndex) == 0 ? Boolean.FALSE : Boolean.TRUE; } }, DATE("TEXT") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, DateUtils.format((Date)value, DateTimeFormat.YYYYMMDDHHMMSS)); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public Date readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } String date = cursor.getString(columnIndex); return DateUtils.parse(date, DateTimeFormat.YYYYMMDDHHMMSS); } }, DATE_MILLISECONDS("TEXT") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, DateUtils.format((Date)value, DateTimeFormat.YYYYMMDDHHMMSSSSS)); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public Date readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } String date = cursor.getString(columnIndex); return DateUtils.parse(date, DateTimeFormat.YYYYMMDDHHMMSSSSS); } }, DATE_TZ("TEXT") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, DateUtils.format((Date)value, DateTimeFormat.YYYYMMDDHHMMSSZ)); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public Date readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } String date = cursor.getString(columnIndex); return DateUtils.parse(date, DateTimeFormat.YYYYMMDDHHMMSSZ); } }, ENCRYPTED_TEXT("TEXT") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, AndroidEncryptionUtils.encrypt((String)value)); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public String readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } return AndroidEncryptionUtils.decrypt(cursor.getString(columnIndex)); } }, CSV_TEXT("TEXT") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, StringUtils.join((List<?>)value)); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public List<String> readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } return Lists.newArrayList(StringUtils.splitToCollectionWithCommaSeparator(cursor.getString(columnIndex))); } }, MAP("TEXT") { @Override public <T> void writeValue(ContentValues values, String columnName, T value) { if (value != null) { values.put(columnName, new JSONObject((Map<?, ?>)value).toString()); } else { values.putNull(columnName); } } @SuppressWarnings("unchecked") @Override public JSONObject readValue(Cursor cursor, String columnName) { int columnIndex = cursor.getColumnIndex(columnName); if (cursor.isNull(columnIndex)) { return null; } String value = cursor.getString(columnIndex); JsonParser<JSONObject> parser = new JsonParser<JSONObject>() { @Override public Object parse(JSONObject json) { return json; } }; return (JSONObject)parser.parse(value); } }; private String type; DataType(String type) { this.type = type; } public String getType() { return type; } public abstract <T> void writeValue(ContentValues values, String columnName, T value); public abstract <T> T readValue(Cursor cursor, String columnName); }