GreenDAO+AndroidAnontations+TempRest协同开发

来源:互联网 发布:快手喊麦都用什么软件 编辑:程序博客网 时间:2024/06/02 17:05

GreenDAO

  GreenDao基本使用方法这里就不说了,新建java项目,引入两个jar包:freemarker.jar(生成代码模板)+greendao-generator-1.3.1.jar。新建类.

加入如下方法:生成Lesson.java的和ScheduleTime.java的bean类

/** *  * 方法 createScheduleTable<br/> * 创建课程表模块的表 *  * @param schema *            void */public static void createScheduleTable(Schema schema) {// lesson类,主键必须是long类型Entity lesson = schema.addEntity("Lesson");lesson.addIdProperty();lesson.addStringProperty("name");lesson.addStringProperty("teacher");lesson.addDoubleProperty("credit");lesson.addIntProperty("lessonType");lesson.addStringProperty("location");lesson.addStringProperty("cursorId");lesson.addBooleanProperty("selfCreate");lesson.addIntProperty("bgIndex");Property startTime = lesson.addLongProperty("startOnDay").getProperty();Property endTime = lesson.addLongProperty("endOnDay").getProperty();lesson.addIntProperty("weekItem");lesson.addStringProperty("weekRangeJson");// ScheduleTime类Entity time = schema.addEntity("ScheduleTime");time.addLongProperty("section").primaryKey();time.addIntProperty("startTime");time.addIntProperty("endTime");// lesson.startOnDay对应一个ScheduleTime对象, 增加两个多多对一关系lesson.addToOne(time, startTime, "startTime");lesson.addToOne(time, endTime, "endTime");// 一个ScheduleTime有多个lesson,增加一个一对多关系time.addToMany(lesson, startTime, "startTimeLessons");time.addToMany(lesson, endTime, "endTimeLessons");// 设置Lesson和ScheduleTime的生成包路径lesson.setJavaPackage(PROJECT_PACKGE + ".schedule.bean");time.setJavaPackage(PROJECT_PACKGE + ".schedule.bean");}

 

 

java项目执行后生成bean类如图

 

    建议在服务端建立一个于客户端有相同字段的bean,比如我的

 

 

在服务端的逻辑处理里面,用gson将对象转换成json的string形式

在Action_Schedule类里

public void schedule() {// 实例化一个jsonif (responseJson != null) {responseJson.clear();} else {responseJson = new HashMap<String, Object>();}ScheduleControl control = null;try {// 将从URL获取的值写到成员变量中this.response.setContentType("application/json;charset=utf-8");// this.response.setContentType("text/html;charset=utf-8");this.response.setCharacterEncoding("UTF-8");this.setIdNumber(this.request.getParameter("idnumber"));this.setPass(this.request.getParameter("pass"));// 判断参数是否合法if (!checkParmas()) {responseJson.put("state", "fail");responseJson.put("info", "参数不正确");write(responseJson.toString());return;}//new 一个控制器,用于登录教务处和获取课表control = new ScheduleControl(idNumber, pass, null);//登录并获取登录状态LoginState state = control.login();//如果登录失败if (!state.isLoginSucess()) {responseJson.put("state", "fail");responseJson.put("info", state.getErrMsg());}else {//如果登录成功,则进一步获取课表List<ClientLesson> lessons = control.getLessons();if (lessons == null) {responseJson.put("state", "fail");responseJson.put("info", "获取课表出错,请与客服联系,谢谢!");} else {//这是重点,用gson将对象直接转换成json的string表示方式,然后返回个客户端Gson gson = new Gson();responseJson.put("state", "sucess");responseJson.put("info", "获取课表成功");responseJson.put("results", gson.toJson(lessons));}}} catch (Exception e) {e.printStackTrace();responseJson.put("state", "fail-3");responseJson.put("info", "读取失败,请检查网络或重试!");} finally {if (control != null) {control.closeConnect();}}this.write(responseJson.toString());}


 

 

 

 

 

 

回到客户端,我新增了一个包,新增了几个类

以下是一些代码

 

在net包下写一个Rest

 

package cn.gzpypie.net;import org.androidannotations.annotations.rest.Accept;import org.androidannotations.annotations.rest.Post;import org.androidannotations.annotations.rest.Rest;import org.androidannotations.api.rest.MediaType;import org.springframework.http.converter.json.GsonHttpMessageConverter;import cn.gzpypie.util.HttpURL;/** *  * @Title: MainRest * @Description: 这是用rest访问服务器的主要接口,只需封装访问结果,并在这里写一个post方法或这get方法 *  这里使用GSON作为解析器,gson的作用是将json转换成对象,rest的作用是调用gson的方法将服务器返回的数据解析成对象 *  AA的作用是简化rest使用步骤 * @author chenkaihua * @date 2014年10月7日 * @email 954822984@qq.com */@Rest(rootUrl = HttpURL.BASE_LOCAL_URL, converters = GsonHttpMessageConverter.class)@Accept(MediaType.APPLICATION_JSON)public interface MainRest {/** *  * 方法 getNetInfoLesson<br/> * 执行一个post请求,需要自己拼装url,参数值用{}代替,并在方法参数中定义 *  * @param idnumber *            学号 * @param pass *            教务处密码 * @return NetInfo 返回经过解析并且成功我们期望的bean类型 */@Post(HttpURL.SCHDULE + "idnumber={idnumber}&pass={pass}")ScheduleNetResult getLessonsByNet(String idnumber, String pass);@Post(HttpURL.FOUNDLOST + "operation={operting}&id={id}")FountLoastNetResult getFoundLostByNet(String operting, String id);@Post(HttpURL.GUESTBOOK + "operation={ope}&belong={belong}&id={id}")ChatNetResult getChatNetByNet(String ope, String belong, String id);}


 

 

 

 

BaseNetResult.java

package cn.gzpypie.net;/** *  * @Title: BaseNetResult * @Description: 服务器json数据最外层包装,包含了两个成员变量info和state,并提供 *               {@link BaseNetResult#stateIsScucess()}判断是否结果为成功,所有网络操作相关类 *               都应该继承这个类,并且要有成员变量results,不然转换不能成功 * @author chenkaihua * @date 2014年10月5日 * @email 954822984@qq.com */public abstract class BaseNetResult {private String info;private String state;public String getInfo() {return info;}public void setInfo(String info) {this.info = info;}public String getState() {return state;}public void setState(String state) {this.state = state;}/** *  * 方法 stateIsScucess<br/> * 状态是否成功,内部将调用 {@code state.equals("sucess")} *  * @return boolean */public boolean stateIsScucess() {return state != null && state.equals("sucess");}}


ScheduleNetResult继承baseNetResult

 
<pre class="java" name="code">package cn.gzpypie.net;import java.util.List;import cn.gzpypie.schedule.bean.Lesson;public class ScheduleNetResult extends BaseNetResult {List<Lesson> results;public List<Lesson> getResults() {return results;}public void setResults(List<Lesson> results) {this.results = results;}}

接下来在获取服务器数据的逻辑处理里面,@RestService注解rest

@RestServiceprotected MainRest mRest;

逻辑处理方法

 

// 后台线程处理网络@Backgroundvoid login(String idNumber, String pass) {mModel.storeIdPass(idNumber, pass);// 这个方法是更新进度条的,在ui线程执行changePregress(false, false, "正在连接服务器.....");// 这里用try catch捕获网络异常信息,如果没捕获,一旦发生异常,抛出runtimeException,你懂得,,try {// 执行一个网络请求,并得到服务器返回的数据,并且自动转换成期望对象,完全不用自己解析jsonScheduleNetResult info = mRest.getLessonsByNet(idNumber, pass);// 判断服务器返回数据的状态,changePregress(false, false, "获取数据成功.....");if (!info.stateIsScucess()) {changePregress(true, true, info.getInfo());return;}// 得到所有课程List<Lesson> lessons = (List<Lesson>) info.getResults();if (lessons == null || lessons.isEmpty()) {changePregress(true, true, "获取到课表为空,请与客服联系");return;}changePregress(false, false, "正在清空数据....");// 为了区分背景色,可以忽略HashMap<String, Integer> bgs = new HashMap<String, Integer>();int index = 0;for (Lesson lesson : lessons) {int bgIndex = -1;String cursorId = lesson.getCursorId();if (bgs.containsKey(cursorId)) {bgIndex = bgs.get(cursorId);} else {bgIndex = index % 6 + 1;index++;bgs.put(cursorId, bgIndex);}lesson.setBgIndex(bgIndex);lesson.setSelfCreate(false);lesson.initJsonWeekRange();}// mModel是GreenDao生成的lessonDAO的简单包装类,负责对lesson表和其他相关数据增删改查,// 清除数据库总所有数据mModel.clearAllDB();// 插入一系列课程mModel.insertLessons(lessons);// 重新载入课程mModel.reLoadCursor();changePregress(false, true, "课表更新成功,可以使用啦!");// 主线程通知view更新notifyUpdateView();} catch (HttpClientErrorException e) {// 这里捕捉到异常,说明连接服务器失败了changePregress(true, true, "连接至服务器失败" + e.getStatusText());} catch (RestClientException e) {changePregress(true, true, "连接至服务器失败" + e.getMessage());}}


 

 


 

 

 

 

 


 

0 0
原创粉丝点击