Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)

标签: android 项目 开发 | 发表时间:2013-03-05 10:55 | 作者:农民伯伯
出处:http://www.cnblogs.com/

 

前言

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

 

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

 

正文

一、简介

1.1ormlite

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

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

——转载自 这里。 

1.2hessian 

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

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

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

 

1.3Android快速开发框架说明

考虑如下几个特点:

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 项目 开发] 推荐:

Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)

- - 博客园_首页
结合之前所用的ormlite和hessian,再加上SAE已经支持JAVA,把服务端切换到JAVA,也就有了本文. 使用hessian来做数据传输,ormlite来实现客户端与服务端的数据存储,极大的减少了CRUD工作. 本文为探索贴,未正式用于大型项目,欢迎大家讨论使用.   欢迎转载,但请保留文章原始出处:).

Android开发者应该深入学习的10个开源应用项目

- zjzxzhang - ITeye资讯频道
  Android开发带来新一轮热潮让很多移动开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用. 其中也有许许多多的开发者提供了应用开 源项 目,贡献出他们的智慧和创造力. 学习开源代码是掌握技术的一个最佳方式. 下面推荐几个应用开源项目,这些项目不仅提供了优秀的创意,也可以直接掌握 Android内核的接口使用.

Android优秀开源项目

- - CSDN博客移动开发推荐文章
Android经典的开源项目其实非常多,但是国内的博客总是拿着N年前的一篇复制来复制去,实在是不利于新手学习. 今天爬爬把自己熟悉的一些开源项目整理起来,希望能对 Android开发同学们有所帮助. 另外,如果你有比较好的项目推荐,也烦请在评论里分享出来,我会定期更新博客内容. Apollo音乐播放器:就一个播放器,但是实现的很好.

Canonical 宣布 Ubuntu for Android 项目

- - Wow! Ubuntu
Canonical 正式宣布推出 Ubuntu for Android 项目,从官方介绍来看,这个项目并不是要取代 Android 作为手机操作系统,而是把整个 Ubuntu 桌面系统无缝整合到 Android 中,Android 与 Ubuntu 会共用一个 Linux 内核. 在安装 Ubuntu for Android 后,用户就可以把这台 Android 手机当作一台便携式电脑,你可以通过支持 HDMI 接口的配件与显示器连接,这样就可以体验 Ubuntu Unity 界面了.

Android开发Tips

- - CSDN博客推荐文章
欢迎Follow我的 GitHub, 关注我的 CSDN.. 介绍一些, 在Android开发中, 会经常使用的小知识点.. submodule与git可以保持实时同步. 导入, 路径多于一个, 前面不添加冒号(:).. 使用PackageManager.. // 检查App是否安装 private boolean appInstalledOrNot(String uri) {.

Google code android开源项目(四)

- - CSDN博客推荐文章
一个简洁的android rss阅读器. 创建者写的一些应用包括:闹钟和调节屏幕亮度小工具等. 远程控制winamp(5.5以上版本).  Tesseract OCR(HP实验室开源的)封装的 Android APIs. 使用 visual studio 开发Android NDK C/C++ . android版quake2.

GitHub 优秀的 Android 开源项目

- - 移动开发 - ITeye博客
GitHub 优秀的 Android 开源项目. 转自:http://blog.csdn.net/shulianghan/article/details/18046021. 主要介绍那些不错个性化的View,包括ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar及其他如Dialog、Toast、EditText、TableView、Activity Animation等等.

安居客Android项目架构演进

- - SegmentFault 最新的文章
入职安居客三年从工程师到Team Leader,见证了Android团队一路走来的发展历程. 因此有心将这些记录下来与大家分享,也算是对自己三年来一部分工作的总结. 希望对大家有所帮助,更希望能得到大家宝贵的建议. 三年前入职时安居客在业务上刚完成了三网合并(新房、二手房、好租和商业地产多个平台多个网站合成现在的anjuke.com,这在公司的历史上称之为三网合并),因此app端也将原先的新房、二手房、好租和商业地产多个app合并成为了现在的安居客app.

Android 开发者调查

- - 爱范儿 · Beats of Bits
Startup 是为 Android 开发者提供盈利模式的一个公司. Android 开发者只要在应用上推广 Startup 服务,并且为网站带去流量,就可以得到网站给予的补贴. 今年 3 月的时候,Startup 网站对 Android 开发者进行了一次调查. 现在,他们将调查的结果制成了信息图,并 发布在网站之上.