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
- GreenDAO+AndroidAnontations+TempRest协同开发
- 协同开发平台cnforge
- 协同开发总结
- git常用命令,协同开发
- iOS 协同开发 问题
- GitHub协同开发
- git中多人协同开发
- GitHub 的协同开发
- GitHub协同开发fork
- 我的greendao开发实践
- 使用greenDAO进行开发总结
- Android 快速开发数据库greenDao
- greenDao
- greenDAO
- greenDAO
- greenDAO
- GreenDao
- GreenDAO
- eclipse导入项目出现乱码
- 黑马程序员——OC语言Protocol(协议)
- Ruby: How to find all indices of elements that match a given condition?
- github 一些实用的GitHub模式
- Android Call requires API level 11 (current min is 8)的解决方案
- GreenDAO+AndroidAnontations+TempRest协同开发
- 【摘要】图像文本检测提取算法
- 用C/C++语言实现贪吃蛇游戏
- 在网页中添加视频(HTML)
- log4j日志配置文件
- UNIX高级环境2的环境搭建
- git 理解Git的工作流程
- DOCTYPE的影响
- 日积月累:Linux中的点命令(.)和source命令