Android 自动建表

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;
	}
 }






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值