Android数据库和Bean的交互
Android中数据库使用的轻量级的Sqlite数据库,创建数据库的过程,因为系统都封装好了,所以比较简单。只要继承SQLiteOpenHelper即可。然后再写一些增删改查的函数就可以了。
Android系统对数据的操作,就我的理解,主要是
网络请求-内存(数据模型)-本地存储
而 JSON数据-本地Bean对象-数据库 则是其中一种通用的路子。
json到Bean对象以及Bean和数据库的交互转化,虽然可以针对每一种数据模型来实现,但是那样做未免太麻烦,同时也会浪费太多不必要的精力。
fastjson(阿里工程师开发的)和GSON(谷歌带的)就是很好的实现了json和Bean转化的框架,里面都是用的反射来实现的,其实也只能用反射,只不过牛逼的框架一般做的都很全,在性能上也处理的比较的当,我等也能佩服。
当然我现在要说的是数据库和Bean的交互,因为时间比较匆忙,也没精力找别人写好的框架用,所以自己就简单的写了个。
用到了反射,但是因为数据库中的字段名称和我自己的命名习惯不符(数据库字段名是已经定好的),所以便退而求其次,用了注解。首先,定义了一个注解:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DBDataType {
/**为数据库中的信息,type=0时表示该为主键,-1为默认值,1,2,3,4为预留值,普通值请从5起,
* 并且表示了该列值在数据库中的添加顺序*/
int type() default -1;
/**数据库中的元素名*/
String elementName() default "";
/**数据库中的元素类型*/
String elementType() default "text";
}
接着在建立的Bean对象中,对每一个field添加注解:
@DBDataType(type = 0, elementName = "ID")
public String id;
其中type是字段在数据库建表时的排列顺序,从5开始,0时表示该字段定义为主键,1,2,3,4为预留值,elementName表示该值在表中的字段名,其实还有一个elementType表示字段的属性,默认是文本类型,其他可以指定
然后就是关键代码,对sql语句进行拼接
try {
/**通过反射获取局部变量*/
Field[] fields = clazz.getDeclaredFields();
/**存储列的序号*/
int[] cloumns = new int[fields.length];
HashMap<Integer,DBDataType> hashMap = new HashMap<Integer,DBDataType>();
/**建立序号到每个field对应的注解DBDataType映射关系*/
for (int i=0;i<fields.length;i++){
DBDataType dbDataTypes = fields[i].getAnnotation(DBDataType.class);
int cloumnNumber = dbDataTypes.type();
cloumns[i] = cloumnNumber;
hashMap.put(cloumnNumber,dbDataTypes);
}
/**
* 对序号进行排序
* */
Arrays.sort(cloumns);
/**开始拼接sql语句*/
String sqlfont = "create table if not exists " + tableName + " (";
String sqlContent = "";
String sqlOver = ")";
for(int i=0;i<cloumns.length;i++){
String elementType = hashMap.get(cloumns[i]).elementType();
String elementName = hashMap.get(cloumns[i]).elementName();
if(cloumns[i]==0){
//该值为主键
sqlContent += elementName + " " + elementType + " primary key" +",";
}else{
sqlContent += elementName + " " + elementType +((i==cloumns.length-1)?"":",");
}
}
String sql = sqlfont + sqlContent + sqlOver;
这里传入的clazz为一个Bean对象,就是通过对field进行注解标记的Bean,这些代码是封装到数据库操作类中的,所以之后创建表,只需要传入一个Bean对象即可。对数据库的插入,查询也是,只需用注解和反射去写好一个通用的方法即可。