package com.minggo.pluto.db.orm; import android.content.ContentValues; import android.database.Cursor; import com.minggo.pluto.annotation.AutoIncrement; import com.minggo.pluto.annotation.Exclude; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Date; /** * 持久化工具类(有Exclude注解的字段排除在外) * @author minggo * @time 2014-6-23 S下午9:32:28 */ public final class DaoUtils { /** * 将对象转为ContentValues 支持【int,long,double,String,date】 * * @param <T> * @param t * @return */ public static final <T> ContentValues object2ContentValues(T t) { ContentValues values = new ContentValues(); try { Class<T> clazz = (Class<T>) t.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); // 将有Exclude注解的字段排除在外 if (field.getAnnotation(Exclude.class) != null) { continue; } Class<?> type = field.getType(); if (type.equals(int.class) || type.equals(Integer.class)) { values.put(field.getName(), field.getInt(t)); } else if (type.equals(String.class)) { values.put(field.getName(), String.valueOf(field.get(t))); } else if (type.equals(long.class) || type.equals(Long.class)) { values.put(field.getName(), field.getLong(t)); } else if (type.equals(double.class) || type.equals(Double.class)) { values.put(field.getName(), field.getDouble(t)); } else if (type.equals(Date.class)) { Date date = (Date) field.get(t); if(date != null){ values.put(field.getName(),date.getTime()); } } } } catch (Exception e) { e.printStackTrace(); } return values; } /** * 将对象转为ContentValues 支持【int,long,double,String,date】除了自增字段 * @param t * @return */ public static final <T> ContentValues object2ContentValuesWithoutIncrement(T t) { ContentValues values = new ContentValues(); try { Class<T> clazz = (Class<T>) t.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); // 将有Exclude注解的字段排除在外 if (field.getAnnotation(Exclude.class) != null||field.getAnnotation(AutoIncrement.class)!=null) { continue; } Class<?> type = field.getType(); if (type.equals(int.class) || type.equals(Integer.class)) { values.put(field.getName(), field.getInt(t)); } else if (type.equals(String.class)) { values.put(field.getName(), String.valueOf(field.get(t))); } else if (type.equals(long.class) || type.equals(Long.class)) { values.put(field.getName(), field.getLong(t)); } else if (type.equals(double.class) || type.equals(Double.class)) { values.put(field.getName(), field.getDouble(t)); } else if (type.equals(Date.class)) { Date date = (Date) field.get(t); if(date != null){ values.put(field.getName(),date.getTime()); } } } } catch (Exception e) { e.printStackTrace(); } return values; } /** * 将游标转为对象集合 支持【int,long,double,String,date】 * * @param <T> * @param cursor * @param clazz * @return */ public static final <T> ArrayList<T> cursor2ObjectList(Cursor cursor, Class<T> clazz) { ArrayList<T> list = new ArrayList<T>(); try { if (clazz != null && cursor != null && !cursor.isClosed()) { String[] columnNames = cursor.getColumnNames(); int length = columnNames.length; Field[] fields = clazz.getDeclaredFields(); while (cursor.moveToNext()) { T instance = clazz.newInstance(); for (int index = 0; index < length; index++) { String columnName = columnNames[index]; for (Field field : fields) { field.setAccessible(true); // 排除Exclude注解的字段 if (field.getAnnotation(Exclude.class) != null) { continue; } if (field.getName().equals(columnName)) { setField(cursor, index, instance, field); } } } list.add(instance); } } } catch (Exception e) { e.printStackTrace(); } return list; } private static final <T> void setField(Cursor cursor, int columnIndex, T instance, Field field) throws IllegalArgumentException, IllegalAccessException { Class<?> type = field.getType(); field.setAccessible(true); int index = cursor.getColumnIndex(field.getName()); if (type.equals(int.class) || type.equals(Integer.class)) { field.setInt(instance, cursor.getInt(index)); } else if (type.equals(String.class)) { field.set(instance, cursor.getString(index)); } else if (type.equals(long.class) || type.equals(Long.class)) { field.setLong(instance, cursor.getLong(index)); } else if (type.equals(double.class) || type.equals(Double.class)) { field.setDouble(instance, cursor.getDouble(index)); }else if (type.equals(Date.class)) { long datetime = cursor.getLong(index); if(datetime>0){ field.set(instance, new Date(datetime)); } } } }