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对象即可。对数据库的插入,查询也是,只需用注解和反射去写好一个通用的方法即可。

Loading Disqus comments...
Table of Contents