Android項目快速開發框架探索(Mysql + OrmLite + Hessian + Sqlite)


 

前言

結合之前所用的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  

 

結束

探索永無止境!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM