import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
/**
* @author
* @date
*/
public class TableBuilder {
public static final String PRIMARY_KEY = "_id";
private static final Map<Class<?>, String> TYPES = new HashMap<Class<?>, String>();
static {
TYPES.put(byte.class, "INTEGER");
TYPES.put(boolean.class, "INTEGER");
TYPES.put(short.class, "INTEGER");
TYPES.put(int.class, "INTEGER");
TYPES.put(long.class, "INTEGER");
TYPES.put(String.class, "TEXT");
TYPES.put(byte[].class, "BLOB");
TYPES.put(float.class, "REAL");
TYPES.put(double.class, "REAL");
}
public static String createSQLStatement(Entity entity) {
StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ");
sb.append(entity.getTableName());
sb.append(" (" + PRIMARY_KEY + " INTEGER PRIMARY KEY AUTOINCREMENT");
Class cls = entity.getClass();
Field[] f = cls.getDeclaredFields();
for (Field field : f) {
String name = field.getName();
Class c = field.getType();
String type = TYPES.get(c);
if (type != null) {
sb.append(',');
sb.append(name + " " + type);
if (field.isAnnotationPresent(unique.class)) {
sb.append(" UNIQUE");
}
}
}
if (cls.isAnnotationPresent(uniqueConstraints.class)) {
uniqueConstraints constraints = (uniqueConstraints) cls
.getAnnotation(uniqueConstraints.class);
String columnName = constraints.columnNames();
sb.append(",UNIQUE(" + columnName + ")");
String clause = constraints.clause().toString();
sb.append(" ON CONFLICT " + clause);
}
sb.append(')');
return sb.toString();
}
public static String dropSQLStatement(String tableName) {
return "DROP TABLE IF EXISTS " + tableName;
}
}