Android自动穿件Sqlite数据表,只需要在SQLiteOpenHelper中的onCreate方法中调用createTable(Object.class)就会自动创建相应的表
public void createTable(SQLiteDatabase db, Class clazz) {
StringBuffer sb = new StringBuffer();
sb.append("create table if not exists ");
sb.append(clazz.getSimpleName());//使用类名作为表名
sb.append("(");
List<Field> fields = getAllField(clazz);
for (Field field : fields) {
int modify = field.getModifiers();
//过滤所有的静态字段和常量
if (!Modifier.isStatic(modify) && !Modifier.isFinal(modify)) {
//获取注解,如果该字段上有@Column(saveable=false)的注解,则不保存
Column annotation = field.getAnnotation(Column.class);
// field.getDeclaredAnnotations()
if (annotation == null || annotation.saveable()) {
Class<?> fieldType = field.getType();
sb.append(field.getName());
sb.append(" ");
String fieldTypeName = fieldType.getName();
if (fieldTypeName == null) {
fieldTypeName = "text";
}
sb.append(getFieldType(fieldTypeName));
sb.append(",");
}
}
}
//去掉最后一个“,”号
sb.deleteCharAt(sb.length() - 1);
sb.append(")");
//创建数据库
db.execSQL(sb.toString());
}
/**获取clazz类的所有字段,包括父类*/
public List<Field> getAllField(Class clazz) {
List<Field> fields = new ArrayList<Field>();
//如果是基础类行或是Object类型则直接返回
if (isBasicType(clazz) || clazz == Object.class) {
return null;
} else {
//获取自身的所有字段
List<Field> asList = Arrays.asList(clazz.getDeclaredFields());
fields.addAll(asList);
//获取父类的字段
List<Field> allField = getAllField(clazz.getSuperclass());
if (allField != null) {
fields.addAll(allField);
}
return fields;
}
}
/**获取字段的类型映射的数据库类型*/
public String getFieldType(String fieldType) {
if (fieldType != null) {
if (fieldType.equals("int")
|| fieldType.equals("java.lang.Integer")) {
return "integer";
}
if (fieldType.equals("long") || fieldType.equals("java.lang.Long")) {
return "integer";
}
if (fieldType.equals("short")
|| fieldType.equals("java.lang.Short")) {
return "integer";
}
if (fieldType.equals("boolean")
|| fieldType.equals("java.lang.Boolean")) {
return "integer";
}
if (fieldType.equals("java.util.Date")) {
return "integer";
}
if (fieldType.equals("float")
|| fieldType.equals("java.lang.Float")) {
return "real";
}
if (fieldType.equals("double")
|| fieldType.equals("java.lang.Double")) {
return "real";
}
if (fieldType.equals("char")
|| fieldType.equals("java.lang.Character")) {
return "text";
}
if (fieldType.equals("java.lang.String")) {
return "text";
}
}
return null;
}
其中因为可能有些字段我们不需要存储,可以使用注解的方式进行表示,这个注解类如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column {
boolean saveable() default true;
}
/**
* 判断类型clazz是否是基本类型
*
* @param clazz
* @return
*/
public static boolean isBasicType(Class<? extends Object> clazz) {
if (clazz.equals(Integer.class) || clazz.equals(Long.class)
|| clazz.equals(Float.class) || clazz.equals(Double.class)
|| clazz.equals(Boolean.class) || clazz.equals(Byte.class)
|| clazz.equals(Short.class) || clazz.equals(String.class)) {
return true;
} else {
return false;
}
}