Android 自动建表

来源:互联网 发布:金鑫松 知乎 编辑:程序博客网 时间:2024/05/20 11:32
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;} }





0 0
原创粉丝点击