您的位置:首页 > 移动开发 > Android开发

Android 自动建表

2015-12-29 08:51 393 查看
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;
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: