/*
* Copyright (C) 2013 WhiteCat 白猫 (www.thinkandroid.cn)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.ta.util.db.util;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import android.database.Cursor;
/**
* @Title TASqlBuilder
* @Package com.ta.util.db.util.sql
* @Description 通过Cursor构建实体的类
* @author 白猫
* @date 2013-1-20
* @version V1.0
*/
public class TAEntityBuilder
{
/**
* 通过Cursor获取一个实体数组
*
* @param clazz
* 实体类型
* @param cursor
* 数据集合
* @return 相应实体List数组
*/
@SuppressWarnings("unchecked")
public static <T> List<T> buildQueryList(Class<T> clazz, Cursor cursor)
{
List<T> queryList = new ArrayList<T>();
if (cursor.moveToFirst())
{
do
{
queryList.add((T) buildQueryOneEntity(clazz, cursor));
} while (cursor.moveToNext());
}
return queryList;
}
/**
* 通过Cursor获取一个实体
*
* @param clazz
* 实体类型
* @param cursor
* 数据集合
* @return 相应实体
*/
@SuppressWarnings("unchecked")
public static <T> T buildQueryOneEntity(Class<?> clazz, Cursor cursor)
{
Field[] fields = clazz.getDeclaredFields();
T entityT = null;
try
{
entityT = (T) clazz.newInstance();
for (Field field : fields)
{
field.setAccessible(true);
if (!TADBUtils.isTransient(field))
{
if (TADBUtils.isBaseDateType(field))
{
String columnName = TADBUtils.getColumnByField(field);
field.setAccessible(true);
setValue(field, columnName, entityT, cursor);
}
}
}
} catch (InstantiationException e)
{
e.printStackTrace();
} catch (IllegalAccessException e)
{
e.printStackTrace();
}
return entityT;
}
/**
* 设置值到字段
*
* @param field
* 需要设置的字段
* @param columnName
* 数据库字段名
* @param entityT
* 实体模版
* @param cursor
* 数据集合
*/
private static <T> void setValue(Field field, String columnName, T entityT,
Cursor cursor)
{
try
{
int columnIndex = cursor
.getColumnIndexOrThrow((columnName != null && !columnName
.equals("")) ? columnName : field.getName());
Class<?> clazz = field.getType();
if (clazz.equals(String.class))
{
field.set(entityT, cursor.getString(columnIndex));
} else if (clazz.equals(Integer.class) || clazz.equals(int.class))
{
field.set(entityT, cursor.getInt(columnIndex));
} else if (clazz.equals(Float.class) || clazz.equals(float.class))
{
field.set(entityT, cursor.getFloat(columnIndex));
} else if (clazz.equals(Double.class) || clazz.equals(double.class))
{
field.set(entityT, cursor.getDouble(columnIndex));
} else if (clazz.equals(Short.class) || clazz.equals(Short.class))
{
field.set(entityT, cursor.getShort(columnIndex));
} else if (clazz.equals(Long.class) || clazz.equals(long.class))
{
field.set(entityT, cursor.getLong(columnIndex));
} else if (clazz.equals(Byte.class) || clazz.equals(byte.class))
{
field.set(entityT, cursor.getBlob(columnIndex));
} else if (clazz.equals(Boolean.class))
{
Boolean testBoolean = new Boolean(cursor.getString(columnIndex));
field.set(entityT, testBoolean);
} else if (clazz.equals(Date.class))
{
@SuppressWarnings("deprecation")
Date date = new Date(cursor.getString(columnIndex));
field.set(entityT, date);
} else if (clazz.equals(Character.class)
|| clazz.equals(char.class))
{
Character c1 = cursor.getString(columnIndex).trim()
.toCharArray()[0];
field.set(entityT, c1);
}
} catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}