前言

结合之前所用的ormlite和hessian,再加上SAE已经支持JAVA,把服务端切换到JAVA,也就有了本文。使用hessian来做数据传输,ormlite来实现客户端与服务端的数据存储,极大的减少了CRUD工作。本文为探索贴,未正式用于大型项目,欢迎大家讨论使用!

声明
  欢迎转载,但请保留文章原始出处:)
    博客园:http://www.cnblogs.com
    农民伯伯: http://www.cnblogs.com/over140/

正文

一、简介

1.1 ormlite

Ormlite[Object Relational Mapping Lite (ORM Lite)] 对象关系映射精简版(精简版的ORM)提供了一些简单的,轻量级持久化Java对象到SQL数据库,同时也避免了复杂性和更多的标准的ORM包的开销的功能。

支持数据库的jdbc调用,当然,最重要的肯定是它支持android原生的数据库api调用sqlite。

——转载自这里

1.2 hessian

使用方法参照本博两篇文章:

[hessdroid]Android下使用Hessian与Java服务端通讯

[hessdroid]Android下使用Hessian与Java服务端通讯的传值测试

1.3 Android快速开发框架说明

考虑如下几个特点:

a). 客户端(Android)和服务端均使用Java语言

b). 客户端(Android)和服务端均支持Hessian和ormlite框架

c). 完整的支持面向对象开发:存储和交互传输

二、准备

2.1 开发环境

为了便于同时开发Android和Java Web,这里下载的是Eclipse IDE for Java EE Developers版本,然后安装最新的ADT插件和TOMCAT插件。

2.2 服务端

应用服务器使用Tomcat,采用Java(JSP/Servlet)来实现服务端的业务逻辑,数据库使用Mysql。快速框架搭建推荐大家使用XAMPP(集成Apache、MySQL、PHP等,支持绿色安装)。

2.3 客户端

普通的Android环境

2.4 通信与存储说明

服务端与客户端通过Hessian进行数据交换,通过Ormlite保存数据库(通过JDBC保存到服务端的MYSQL数据库,也可以直接保存到客户端的sqlite数据库);

三、代码

3.1 项目工程截图(服务端)

HOLib共用于客户端和服务端,保证接口和数据对象一致性。

3.2 重点代码分析

3.2.1 服务端

web.xml


<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"     version="2.4">
    <servlet>         <servlet-name>user</servlet-name>         <servlet-class>com.nmbb.ho.server.servlet.UserServlet</servlet-class>     </servlet>
    <servlet-mapping>         <servlet-name>user</servlet-name>         <url-pattern>/user.do</url-pattern>     </servlet-mapping>         <listener>         <listener-class>com.nmbb.ho.server.StartupInit</listener-class>     </listener>
</web-app>

StartupInit.java


public class StartupInit implements ServletContextListener {
    @Override     public void contextInitialized(ServletContextEvent arg0) {         try {             TableUtils.dropTable(OrmliteHelper.getConnection(), POUser.class,                     true);             //创建数据库             TableUtils.createTable(OrmliteHelper.getConnection(), POUser.class);         } catch (SQLException e) {             e.printStackTrace();         }     }
    @Override     public void contextDestroyed(ServletContextEvent arg0) {
    }
}

代码说明:

StartupInit可用于创建数据库表结构,这里用于测试,真实环境注意数据丢失问题。

POUser.java


@DatabaseTable(tableName = "nmbb_users") public class POUser implements Serializable {
    /** 用户编号,6位数字 */     @DatabaseField(generatedId = true)     public int suid;
    /** 用户名 */     @DatabaseField(width = 30)     public String username;
    /** 密码 */     @DatabaseField(width = 30)     public String password;
    /** 昵称 */     @DatabaseField(width = 60)     public String nickname;
    /** 200 正常 201 数据校验错误 202用户已经存在 */     public int status = 200;
    /** 用于放错误信息 */     public String msg;
    public POUser() {
    } }

代码说明:

注意需要一个空的构造函数,其他请参考ormlite资料。

UserServlet.java


/**  * 用户Servlet  *   * @author 农民伯伯  * @see http://www.cnblogs.com/over140/archive/2013/02/19/2917231.html  *  */ public class UserServlet extends HessianServlet implements IUserService {
    @Override     public POUser register(String username, String password) {         POUser result = new POUser();
        System.out.println("[UserServlet.register]...");
        // 检测数据是否合法         if (isEmpty(username) || isEmpty(password)) {             result.status = 201;             result.msg = "用户名或密码不能为空";         } else {             // 检测用户是否存在             OrmliteHelper<POUser> db = new OrmliteHelper<POUser>();             if (db.exist(POUser.class, "username", username)) {                 result.status = 202;                 result.msg = "用户名已经存在";             } else {                 result.username = username;                 result.password = password;                 db.create(result);// 入库                 result.msg = "注册成功";                 System.out.println("create user suid:" + result.suid);             }         }         return result;     }
    @Override     public List<POUser> query(int suid, int startIndex, int pageSize) {         return new OrmliteHelper<POUser>().query(POUser.class, "suid", suid, startIndex, pageSize) ;     }
    /**      * 判断字符串是否为空      *      * @param str      * @return      */     public static boolean isEmpty(String str) {         return str == null || str.length() == 0;     } }

3.2.2 客户端(Android)


public class UserActivity extends Activity {
    @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);     }
    public void OnClickRegiger(View view) {         new AsyncTask<Void, Void, POUser>() {
            @Override             protected POUser doInBackground(Void... params) {                 String url = "http://192.168.68.23:8081/HOServer/user.do";                 HessianProxyFactory factory = new HessianProxyFactory();                 try {                     factory.setDebug(true);                     factory.setReadTimeout(5000);                     //不设置会报 expected hessian reply at 0x48                     factory.setHessian2Reply(false);                     IUserService basic = (IUserService) factory.create(IUserService.class, url, getClassLoader());                     return basic.register("admin", "123456");
                } catch (MalformedURLException e) {                     Log.e("UserActivity", "OnClickRegiger", e);                 } catch (Exception e) {                     Log.e("UserActivity", "OnClickRegiger", e);                 }                 return null;             }
            @Override             protected void onPostExecute(POUser result) {                 if (result != null) {                     if (result.status == 200) {                         //保存入库                         new DbHelper<POUser>().create(result);                     }                     Toast.makeText(UserActivity.this, "" + result.msg, Toast.LENGTH_LONG).show();                 }             };
        }.execute();
    } }

代码说明:

1、DbHelper在源码里给出。

2、如果项目无法编译通过,请注意设置项目的字符编码、JDK版本、Android的版本。

三、总结

5.1 优点

a). 完全面向对象开发

b). 降低项目的复杂度,减少引入其他框架所带来的复杂性

c). 非常适合一个开发服务端和客户端

充分的利用的框架的特点,提交开发效率,适合中小型项目快速开发。

5.2 缺点

a). 注意服务端与客户端共用id的问题

5.3 其他

a). ormlite支持标准的JPA助记符,这里。这样服务端采用Hibernate应该也是可以的,有时间可以做一个整合例子看看。

b). 测试发现整个框架也适用于SAE,如果一个人负责客户端和服务端,那就太幸福了!

四、下载

AndroidFramework2013-03-05.zip

结束

探索永无止境!

[转]Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)的更多相关文章

  1. android的快速开发框架集合

    出自:http://blog.csdn.net/shulianghan/article/details/18046021 1.Afinal  (快速开发框架) 简介:http://www.oschin ...

  2. XDroidMvp 轻量级的Android MVP快速开发框架

    XDroidMvp是XDroidAndroid快速开发框架的MVP版本,其使用方式类似于XDroid,大部分源码也来自XDroid. XDroidMvp主要会有这些特性: 无需写Contract! 无 ...

  3. 【Android】Android的快速开发框架Afinal

    Afinal简介 Afinal是一个android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp. 通过finalA ...

  4. MyBatis项目快速搭建及MySQL一个Statement支持多条命令参数

    一.简述 本文以笔记的形式,记录一个基本Mybatis项目的使用,方便后期项目使用到相关配置时直接复制使用. 二.项目结构 pom.xml中的依赖 <!-- https://mvnreposit ...

  5. Android的快速开发框架afinal

    afinal 是一个android的 orm 和 ioc 框架.而且封装了android中的httpClient,使其更加简单易用. afinal是android应用开发的终极框架. FinalDB使 ...

  6. Android的快速开发框架 afinal

    afinal 框架学习: http://www.oschina.net/p/afinal

  7. Base-Android快速开发框架(三)--数据存储之SQLite

    SQLite,是一款轻量级的关系型数据库,Android原生集成的一个数据库.具有轻量级.独立性.隔离性.安全性等特点.是Android做数据存储的必备知识之一. 在实际的项目中,我们常用于一些对象的 ...

  8. 64.GitHub 排名前100的android项目简介

    GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...

  9. gitHub优秀android项目

    转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.M ...

随机推荐

  1. iOS 获取手机 唯一标识

    存贮在keychainQuery 可以统计用户使用情况 -(void)gatherMessage{ //采集用户设备信息 NSUserDefaults *userDefaults=[NSUserDef ...

  2. LoadRunner 比较字符串是否相等

    int strcmp ( const char *string1, const char *string2 );大小写敏感.int stricmp ( const char *string1, con ...

  3. 修正iOS从照相机和相册中获取的图片 方向

    修正iOS从照相机和相册中获取的图片 方向   修正iOS从照相机和相册中获取的图片 方向 使用系统相机拍照得到的图片的默认方向有时不是ImageOrientationDown,而是ImageOrie ...

  4. UVALive3126 Taxi Cab Scheme —— 最小路径覆盖

    题目链接:https://vjudge.net/problem/UVALive-3126 题解: 最小路径覆盖:即在图中找出尽量少的路径,使得每个结点恰好只存在于一条路径上.其中单独一个点也可以是一条 ...

  5. HDU1542 Atlantis —— 求矩形面积并 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-1542 There are several ancient Greek texts that contain descript ...

  6. YTU 2896: J--Zipper

    2896: J--Zipper 时间限制: 1 Sec  内存限制: 128 MB 提交: 29  解决: 15 题目描述 Given three strings, you are to determ ...

  7. golang中获取字符串长度的几种方法

    一.获取字符串长度的几种方法   - 使用 bytes.Count() 统计   - 使用 strings.Count() 统计   - 将字符串转换为 []rune 后调用 len 函数进行统计   ...

  8. IJ:IJ来了2-调试开发环境

    ylbtech-IJ:IJ来了2 1.返回顶部 1. 2. 3. 4. 2. 配置SVN返回顶部 1.SVN安装时,要选上command line client tools 2. 3.   4. 3. ...

  9. 80个Python经典资料(教程+源码+工具)汇总——下载目录 ...

    原文转自:http://bbs.51cto.com/thread-935214-1.html 大家好,51CTO下载中心根据资料的热度和好评度收集了80个Python资料,分享给Python开发的同学 ...

  10. 使用VS进行打包程序解决生成两个文件的问题(压缩后只有一个exe)

    使用VS打包创建setup相信大家都挺熟的了,不熟的话网上也有很多,就不做介绍了,现在给大家写下怎么将生成的那些文件夹以及setup.exe和.msi 文件打包成一个exe 我们这里使用的是Winra ...