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

来源:互联网 发布:网络大电影平台有哪些 编辑:程序博客网 时间:2024/06/01 20:55

之前的几篇博文中提到过封装网络工具类,那么在发送请求并获取一个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 0
原创粉丝点击