李慶江
(菏澤學(xué)院 教務(wù)處,山東 菏澤 274015)
服務(wù)器使用Client/Server[1]通訊原理,通過它可以充分利用兩端硬件環(huán)境的優(yōu)勢,將任務(wù)合理分配到 Client端和Server端來實(shí)現(xiàn),降低了系統(tǒng)的通訊開銷??傮w結(jié)構(gòu)系統(tǒng)的模塊結(jié)構(gòu)包括消息管理模塊、團(tuán)隊管理模塊和任務(wù)管理模塊。
1.2.1 頂層處理流
手機(jī)端通過移動網(wǎng)絡(luò)把指令上傳的服務(wù)器,服務(wù)器對指令進(jìn)行處理后返回XML形式的數(shù)據(jù),手機(jī)端對返回的數(shù)據(jù)進(jìn)行解析。
1.2.2 第一層處理流
1)登錄子系統(tǒng)
手機(jī)通過移動網(wǎng)絡(luò),發(fā)送用戶名密碼信息到服務(wù)器端,服務(wù)器接受到信息后調(diào)用數(shù)據(jù)庫核對信息,核對后把True和False信息返回,手機(jī)隊返回數(shù)據(jù)解析得到登錄驗(yàn)證是否成功。
2)管理子系統(tǒng)
手機(jī)用戶登錄成功后,進(jìn)入管理子系統(tǒng),可以調(diào)用進(jìn)行消息管理、團(tuán)隊管理和任務(wù)管理三個第二層模塊。
1.2.3 第二層處理流
1)消息管理流程
首先進(jìn)行用戶驗(yàn)證,通過驗(yàn)證后可進(jìn)行查看消息、刪除消息、發(fā)送消息。
2)認(rèn)證加入團(tuán)隊流程
首先進(jìn)行用戶驗(yàn)證,通過驗(yàn)證后可進(jìn)行認(rèn)證/通過、加入團(tuán)隊申請。
3)團(tuán)隊管理流程
首先進(jìn)行用戶驗(yàn)證,通過驗(yàn)證后可進(jìn)行新建、解散、退出和編輯團(tuán)隊。
4)團(tuán)隊成員查看流程
首先進(jìn)行用戶驗(yàn)證,通過驗(yàn)證后,通過用戶ID和團(tuán)隊ID在團(tuán)隊和用戶管理表中查找到團(tuán)隊用戶成員,然后將查詢到的數(shù)據(jù)返回。
5)剔除團(tuán)隊成員
首先進(jìn)行用戶驗(yàn)證是否為隊長,且這個要剔除的成員是否為該團(tuán)隊的成員,通過驗(yàn)證后,就對團(tuán)隊用戶關(guān)聯(lián)表中把關(guān)聯(lián)要刪除的ID進(jìn)行刪除,最后返回成功信息,否則返回不成功信息。
6)查看團(tuán)隊個人任務(wù)列表流程
首先進(jìn)行用戶驗(yàn)證,驗(yàn)證該用戶是否為該團(tuán)隊的成員,通過驗(yàn)證后在數(shù)據(jù)庫中查找到該團(tuán)隊任務(wù)信息,然后將查詢到的數(shù)據(jù)返回。
7)任務(wù)管理流程
首先進(jìn)行用戶驗(yàn)證,驗(yàn)證該用戶是否為要修改任務(wù)的任務(wù)擁有人,通過驗(yàn)證后可進(jìn)行任務(wù)查看、撤銷、完成、更新狀態(tài)。
服務(wù)器判斷會員是否已申請過加入該組,服務(wù)器得到用戶提交的信息,搜索表中是否存在該用戶,如果存在則返回true,否則返回flase,并進(jìn)行異常處理,在操作結(jié)束后,關(guān)閉數(shù)據(jù)庫的連接,以保證數(shù)據(jù)的安全。接收并添加文件,當(dāng)用戶欲添加文件時,先判斷該用戶是否是該隊成員,并作出判斷,提示用戶,如果是該隊成員,接著判斷剩余空間的大小是否充足,并作出判斷。判斷團(tuán)隊人數(shù)是否已滿,通過傳遞的隊號和隊伍的人數(shù),判斷隊伍是否超過最大人數(shù),并作出判斷,返回參數(shù)。
服務(wù)器端主要接口通過XML方式傳送數(shù)據(jù)。
1)用戶接口
采用自己重寫顯示的Android組件和Android的標(biāo)準(zhǔn)顯示組件等。
2)硬件接口
手機(jī)物理或虛擬鍵盤。
3)軟件接口
通過手機(jī)無線借入互聯(lián)網(wǎng),xml文件形式進(jìn)行數(shù)據(jù)交互、通過JDBC對MYSQL[2]數(shù)據(jù)庫的連接。
通過面向?qū)ο笳Z言設(shè)計類,在public類中實(shí)現(xiàn)調(diào)用,類間實(shí)現(xiàn)嚴(yán)格封裝。
系統(tǒng)中數(shù)據(jù)庫采用android內(nèi)置SQLite數(shù)據(jù)庫和MySQL[3]數(shù)據(jù)庫。
以記錄集合作為操作對象,所有SQL語句接受集合作為輸入,返回集合作為輸出,這種集合特性允許一條SQL語句的輸出作為SQL語句的輸入,所以SQL語句可以嵌套,這使他具有極大的靈活性和強(qiáng)大的功能,在多數(shù)情況下,在其他語言中需要一大段程序?qū)崿F(xiàn)的功能只需要一個SQL語句就可以達(dá)到目的,這也意味著用SQL語言可以寫出非常復(fù)雜的語句。
SQLite數(shù)據(jù)庫是一款輕型的數(shù)據(jù)庫,是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),它的設(shè)計目標(biāo)是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了。
3.3.1 手機(jī)端
主要使用了Android內(nèi)置sqllite數(shù)據(jù)庫技術(shù),主要對數(shù)據(jù)庫操作,全都調(diào)用這個類中的具體靜態(tài)方法來對數(shù)據(jù)庫進(jìn)行添刪改查操作。在Android平臺上,集成了一個嵌入式關(guān)系型數(shù)據(jù)庫—SQLite,SQLite3 支持 NULL、INTEGER、REAL(浮點(diǎn)數(shù)字)、TEXT(字符串文本)和BLOB(二進(jìn)制對象)數(shù)據(jù)類型,雖然它支持的類型雖然只有五種,但實(shí)際上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等數(shù)據(jù)類型,只不過在運(yùn)算或保存時會轉(zhuǎn)成對應(yīng)的五種數(shù)據(jù)類型。SQLite最大的特點(diǎn)是你可以保存任何類型的數(shù)據(jù)到任何字段中,無論這列聲明的數(shù)據(jù)類型是什么。例如,可以在Integer字段中存放字符串,或者在布爾型字段中存放浮點(diǎn)數(shù),或者在字符型字段中存放日期型值。但有一種情況例外:定義為INTEGER PRIMARY KEY的字段只能存儲64位整數(shù),當(dāng)向這種字段中保存除整數(shù)以外的數(shù)據(jù)時,將會產(chǎn)生錯誤。另外,SQLite在解析CREATE TABLE語句時,會忽略 CREATE TABLE語句中跟在字段名后面的數(shù)據(jù)類型信息,如下面語句會忽略 name字段的類型信息,主要代碼如下:
public static List<Massage>select(String pid,int maxmid,Connection conn){PreparedStatement pstmt=null;
ResultSet rs=null;
String where="where mid>?and massage.sender=member.pid and massage.tid=team.tid";
where+="and(type=0 or(massage.type=3 and team.tid in (select relevance.tid from relevance,team where relevance.tid=team.tid and relevance.pid=team.pid and relevance.pid=?))";
where+="or(massage.type < 2 and team.tid in(select tid from relevance where pid=?)))order by mid DESC";
List<Massage>massages=new ArrayList<Massage>();
try{String sql="select mid,massage.sender,member.name,massage.tid,team.name,title,content,time,type,team.pid from massage,member,team"+where;
pstmt=conn.prepareStatement(sql);
pstmt.setInt(1,maxmid);pstmt.setString(2,pid);
pstmt.setString(3,pid);rs=pstmt.executeQuery();
while(rs.next()){Integer mid=rs.getInt(1);String sender=rs.getString(2).trim();
String sname=rs.getString(3).trim();Integer tid=rs.getInt(4);String tname=rs.getString(5).trim();String title=rs.getString(6).trim();
String content=rs.getString(7).trim ();Date time=rs.getTimestamp(8);
Short type=rs.getShort(9);String tpid=rs.getString(10);
massages.add(new Massage(mid,sender,sname,tid,tname,title,content,time,type,tpid));}return massages;}catch(SQLE xception ex){
System.out.println("SQLException:"+ex.getMessage());
System.out.println("SQLState:"+ex.getSQLState());
System.out.println("VendorError:"+ex.getErrorCode());return massages;}finally{try{if(rs!=null){rs.close();
rs=null;}if(pstmt!=null){pstmt.close();pstmt=null;}}catch(SQLException e){e.printStackTrace();}}
3.3.2 服務(wù)器端
用戶管理、消息管理和團(tuán)隊管理業(yè)務(wù)Bean,分別對不同的模塊進(jìn)行數(shù)據(jù)的操作,其中有對數(shù)據(jù)庫的具體操作的方法,主要代碼如下。
public Member getOneMember(String pid,String passwd){
Cursor cursor=db.rawQuery("select*from member where_id=?",new String[]{pid});
Member member=null;
if(cursor.moveToFirst()){member=new Member(pid,null,cursor.getString(2),cursor.getShort(3),cursor.getString(4),cursor.getString(5),cursor.getString(6),cursor.getString(7),cursor.getString(8),Timestamp.valueOf(cursor.getString(9)));cursor.close();}return member;}
[1]Alistair Cockburn.敏捷軟件開發(fā)[M].機(jī)械工業(yè)出版社,2000.8:197-289.
[2]公磊.周聰.基于Android的移動終端應(yīng)用程序開發(fā)與研究[J].計算機(jī)與現(xiàn)代化,2008(8):85-89.
[3]高煥堂.Android應(yīng)用框架原理與程式設(shè)計[M]//36技.Google公司,2008:132-150.