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; } }
相关文章推荐
- Android的内存优化
- Android CTS測试Fail项改动总结(四)
- MAC中设置android adb环境变量
- Android ActionBarDrawerToggle、DrawerLayout、ActionBar 结合
- android 自定义动画(一)
- AndroidManifest.xml file missing!
- Android 图片选择和裁剪 之 PictureTool
- Android访问服务器出现W/System.err(9302): java.io.FileNotFoundException:怎么办
- [看书日记20151229] Android动画
- Android中PhoneGap的使用方法
- Android HLS协议相关记录及部分解析
- android实现从系统图库中选择图片,设置到界面上的ImageView控件上。
- Android Battery 在framework相关介绍
- Android学习路线指南
- Android View的可见属性
- Android Studio报错--Error: Library
- 选择蜂窝教育Android培训 我看到了新世界
- android之旅15 广播与广播接收者: 接收系统广播
- android动画
- [实践] Android5.1.1源码 - 在Framework中添加自定义系统服务