android框架搭建——封装一个属于自己的数据存储工具类(sharedPreferences篇)

之前的几篇博文中提到过封装网络工具类,那么在发送请求并获取一个JSONObject对象之后,如何便捷的进行json解析和数据存储便成了我们要考虑的问题,在此分享一下自己在使用了诸多工具之后的一点心得。

首先是json解析,我推荐使用Gson自带的一个方法,一行代码就可以获取所有的数据并将数据存储进bean中,下面给出例子:


这是一个很常见的接口返回数据,该接口的格式为{“retcode”,"retmsg","data"},在"data"中有基本数据类型也有Array数据。首先我们要创建两个bean分别用于存储"data"中的数据和"list"中的数据,代码如下:

LessonIndexBean.java:

public class LessonIndexBean {
private int totalcount;//结果总数目
private long searchtime;
private int pn,ps;//第几页,每页有几条
private List<LessonIndexChildBean>list;
public int getTotalcount() {
	return totalcount;
}
public void setTotalcount(int totalcount) {
	this.totalcount = totalcount;
}
public long getSearchtime() {
	return searchtime;
}
public void setSearchtime(long searchtime) {
	this.searchtime = searchtime;
}
public int getPn() {
	return pn;
}
public void setPn(int pn) {
	this.pn = pn;
}
public int getPs() {
	return ps;
}
public void setPs(int ps) {
	this.ps = ps;
}
public List<LessonIndexChildBean> getList() {
	return list;
}
public void setList(List<LessonIndexChildBean> list) {
	this.list = list;
}

}

LessonIndexChildBean:

public class LessonIndexChildBean {
	private int lessonid;
	private String lessonname;
	private String imgurl;
	private int score;
	private int scorecount;// 评分人数
	private int hit;

	public int getLessonid() {
		return lessonid;
	}

	public void setLessonid(int lessonid) {
		this.lessonid = lessonid;
	}

	public String getLessonname() {
		return lessonname;
	}

	public void setLessonname(String lessonname) {
		this.lessonname = lessonname;
	}

	public String getImgurl() {
		return imgurl;
	}

	public void setImgurl(String imgurl) {
		this.imgurl = imgurl;
	}

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}

	public int getScorecount() {
		return scorecount;
	}

	public void setScorecount(int scorecount) {
		this.scorecount = scorecount;
	}

	public int getHit() {
		return hit;
	}

	public void setHit(int hit) {
		this.hit = hit;
	}

}

不要忘了,为了满足json格式,我们还要创建一个ApiBean,这个Bean适用于同个项目的所有接口:

ApiBean.java:

public class ApiBean<T> {
	private int retcode;
	private String retmsg;
	private T data;

	public int getRetcode() {
		return retcode;
	}

	public void setRetcode(int retcode) {
		this.retcode = retcode;
	}

	public String getRetmsg() {
		return retmsg;
	}

	public void setRetmsg(String retmsg) {
		this.retmsg = retmsg;
	}

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}

}
ok,下面只需要用Gson自带的方法就可以通过一行代码把接口返回的JSONObject对象解析并存入上面创立的bean中:

ApiBean<LessonIndexBean>bean = new Gson().fromJson(object+"",new TypeToken<ApiBean<LessonIndexBean>>(){}.getType());

其中object就是接口返回的JSONObject对象,一行代码,所有的数据都存入了实体类中,是不是很方便。

但是有的时候,我们要在其他的界面使用这些数据,光存入实体类中还不够,我们还想把它们存入本地缓存中。当数据量不大的时候,我们可以通过SharedPrefrences来进行存储。不过使用过SharedPrefrences的同学应该会发现,直接使用SharedPrefrences代码量很大,一行代码只能存储一个数据,如何更加快捷的存储这些数据呢?下面我们就通过范式+反射封装一个数据存储工具类:

public class SharedPrefrenceUtil {
	public static <T> void setData(Context context, T bean, String beanName) throws IllegalAccessException, IllegalArgumentException, InstantiationException {
		SharedPreferences preferences = context.getSharedPreferences(beanName, 0);
		Editor editor = preferences.edit();
		Class c = bean.getClass();
		Field[] fields = c.getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);
			switch (field.getType().getSimpleName()) {
			case "String":
				editor.putString(field.getName(), "" + field.get(bean));
				editor.commit();
				break;

			case "int":
				editor.putInt(field.getName(), (int) field.get(bean));
				editor.commit();
				break;
			case "long":
				editor.putLong(field.getName(), (long) field.get(bean));
				editor.commit();
				break;
			}
		}
	}
}

通过反射的方式遍历输入的bean中的所有变量,再根据变量的不同类型进行不同的存储操作,上面的封装类里只有String,int,long三种类型,我们可以自己往里面添加不同的类型,比如float,double等等,在此就不进行赘述了。

结合之前封装的网络工具类,往往我们只要写四五行代码就可以对一个接口进行数据读取,存储,缓存至本地等一系列操作了,代码量节省了不知道多少!


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值