移动通信软件设计—课程设计_第1页
移动通信软件设计—课程设计_第2页
移动通信软件设计—课程设计_第3页
移动通信软件设计—课程设计_第4页
移动通信软件设计—课程设计_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、移动通信软件设计课程设计题目 个人通讯录院 系 计算机与软件学院班 级 软件工程指导教师 小组成员 二九 年 六 月 十 日2目 录1引言11.1项目背景11.2项目建设意义12系统需求分析13.系统设计13.1 总体设计13.1.1数据库设计13.1.2设计思想13.2 详细设计23.2.1核心技术23.2.2静态类图43.2.3模块设计44.系统实现54.1界面效果54.2核心代码144.2.1 主类144.2.2 包model154.2.3 包ui235小 结40参考文献40I个人通讯录1引言1.1 项目背景 个人通讯录是在移动电话中常用的程序,它可以用来理解在持久存储中进行添加、查找、

2、浏览和删除的过程.它可以清楚地演示每个界面切换的过程,以及响应用户输入的命令。1.2 项目建设意义 首先由于个人通讯录贴切我们的生活,容易获取需求。通过建设这个项目能揭开移动通信编程那神秘的面纱。 另外通过这次的课程设计,使我们能综合运用基础知识和专业理论知识,进行设计和实现。学会高层用户界面的应用。 同时也锻炼了我们团队合作的能力。2系统需求分析 1添加联系人 添加联系人姓名,移动号码,固定号码和邮箱 2查找联系人 根据输入的姓名搜索联系人,并且查看他的详情3删除联系人 删除某个联系人4浏览电话本 浏览所有联系人的信息5清空电话本 将整个电话本都删除3 系统设计3.1 系统总体设计 3.1.

3、1 数据库设计 移动信息设备框架(Mobie Iformation Device Profile)和移动Java应用程序的平台为MIDP应用程序提供一种跨多个调用持久存储数据的机制。这种持久存储机制可以被视为一种简单的面向记录的数据库模型,被称为记录管理系统(Record Management,RMS)。 个人通讯录通过RMS来存储和管理数据。 3.1.2 设计思想 (1)存储联系信息 设计一个“联系人”类,完成联系人信息结构的定义,并提供外部访问接口;设计一个“存储类”,完成存储定义和创建,负责将联系人信息存储到存储器中;出于性能的考虑,还可以设计一个“索引类”,完成索引联系人的映射,可以显

4、著提高联系人的查询速度。 (2)接收用户输入 设计一个“界面控制”类,用于调度各个页面的显示,以及处理用户各种命令或输入;设计若干个“界面”类,用于每个独立的屏幕显示。 (3)初始欢迎界面:初始欢迎界面,即闪屏显示了程序初始的第一个屏幕,一般用于显示版权信息。 (4)程序主界面:它包含了用户可操作的基本功能。进入主界面主菜单添加相应的信息内容选中要删除的内容在主程序中查找相应的信息内容返回主界面显示确认信息查看通讯录删除联系人确认界面信息提示界面添加联系人查询联系人界面显示删除信息显示提示信息3.2 系统详细设计 3.2.1 核心技术 在通常的MIDP应用程序中,包含多个Screen或者是Ca

5、nvas,而界面之间的切换一般是依靠命令来进行切换,比如用户单击Next按扭就可以跳转到下一个界面,单击Previous按扭便会跳转到上一个界面。当应用程序包含大量界面的时候,可以通过MVC实现页面导航。 MVC(Model-view-Controller, 模型-视图-控制器)的核心思想是分离。Model就是对试题类的抽象;View就是在屏幕上的表示;Controller即使协调者。它是基于用户输入的,并将整个问题划分为3个功能模块。(1)模型(Model)模型是应用程序的主体部分,表示业务数据或者业务逻辑,它响应视图的请求。 (2)视图(View) 视图是应用程序中用户界面相关的部分,是用

6、户看到并与之交互的界面。对于应用程序而言,视图就是一系列界面,用于向用户显示数据,并将用户命令传递给控制器,用户所有的操作都是通过视图来完成的。(3)控制器(Controller) 控制器工作就是根据用户的输入来控制用户界面数据显示和更新Model对象状态将MVC分离可以让不同的成员负责不同的模块,一般情况下,M部分由熟悉数据库和网络传输的成员负责;V交给对UI熟悉的成员负责。这样可以提高效率。通常MVC模式的应用程序的工作流程如下图所示。3.2.2 静态类图MIDlet类 MIDP的入口类即基本执行单元BookMIDlet类 被称为应用程序的主类。RecordStore类 用来实现记录存储和

7、完成记录存储的创建,删除与更新,以及记录的添加,删除,查找和更新等操作。Account类 一般把存储的信息封装为Account类,它含有4个字段,即userName,mobilePhone,email和phone.Model类和Index类 RecordStore中来完成记录的添加,删除,读取和更新等操作。AccountFilter类 过滤器类WelcomeUI类 应用程序的欢迎界面实现类,主要任务就是在屏幕指定位置画出欢迎信息。ConfirmationDialog类 是应用程序的的确认对话框类,主要任务是实现形如Windows系统中常见的确认对话框的功能SearchPhoneUI类 完成通讯

8、录的搜索功能,本类实现的搜索功能较弱,仅仅是根据用户名进行搜索。NewPhoneUI类 主要完成用户号码的天家任务,当用户输入完要存储的号码信息后,单击“保存”按钮,便可以完成号码的保存操作。ListPhoneUI类 实现了一个显示列表,它显示符合查询条件的号码列表。Title类 是作为一个工具类而存在的,该类定义了一系列本项目中用到的字符串常量,好处是便于以后修改。3.2.3 模块设计1. 程序主界面:类出用户可以执行的操作,如添加联系人等。 2. 添加联系人模块:添加一个联系人所需要的各种信息,次界面包含了输入这些信息所需的界面控件。 3. 查看/修改/删除联系人信息模块:查看一个已经存储

9、在通信录中的联系人信息,同时允许用户对信息进行修改,甚至删除。4. 查询联系人模块:用于接受用户查询联系人的查询条件。5. 确认操作模块:当用户进行了修改或删除操作时,需要用户再次确认这些操作。6. 信息提示模块:当程序成功地完成了用户的操作时,用于提示操作成功的信息。4 系统实现4.1 界面效果 (1)初始化欢迎界面欢迎界面停止三秒后进入主程序界面。初始欢迎界面即闪屏显示了程序初始的第一个屏幕,一般用于显示版权信息.(2)主界面(3)添加记录初始状态添加记录界面,它包含了联系人信息的所有内容,包括联系人姓名、移动电话、固定电话和电子邮件信息,其中固定电话和电子邮件信息这两项是可选可不选。要求

10、用户从键盘输入。(4)添加记录输入状态添加联系人的信息。进行输入。包括联系人信息的所有内容,包括联系人姓名、移动电话、固定电话和电子邮件信息。(5)、添加记录存储时,姓名不能为空(6)、添加记录时,移动电话同样不能为空(7)、添加记录完成时提示界面(8)、浏览电话本界面 (9)、浏览电话本基本信息界面(10)、电话本列表界面(11)、查看联系人详细信息界面 (12)、删除联系人详细信息界面(13)、删除确认界面 (14)、返回电话本列表界面(15)、查找记录界面 因为此界面是一个List界面,所以在完成了记录的添加之后或者有欢迎界面进入之后,弹出一个主菜单,上面分别显示了:添加记录,查找记录,

11、清空电话本,浏览电话本和系统帮助。在List界面中,选中查找记录,按SELECT键进入。(16)、通过输入姓名来查找对应记录(17)、输入姓名,找到对应的电话本列表(18)、电话本列表界面选中联系人丽丽之后,按手机的菜单键,弹出了两项菜单,分别是:详细信息和删除选项,选中详细信息选项,按SELECT按钮进入。之后的功能就与刚才浏览电话本中的弹出电话本列表之后的相同,具体操作可以参照界面(10)(14)的操作。(19)、清空电话本(20)、电话本清空确认询问界面4.2 核心代码 4.2.1 主类 package com.north.phonebook;import com.north.phone

12、book.model.*;import com.north.phonebook.ui.*;import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;public class PhoneBookMIDlet extends MIDlet private UIController uicontroller; private Model model;/ (返回Model对象的应用) public Model getModel() return model; p

13、rotected void startApp() throws MIDletStateChangeException try /创建控制器对象uicontroller和模型model对象,初始化控制器对象,程序把控制权交给控制器 uicontroller = new UIController(PhoneBookMIDlet.this); model = new Model(); uicontroller.init(model); catch (ApplicationException e) System.out.println(Error when initial the record Sto

14、re); protected void pauseApp() protected void destroyApp(boolean arg0) throws MIDletStateChangeException /(返回控制器对象的应引用) public UIController getUicontroller() return uicontroller; 4.2.2 包modelpackage com.north.phonebook.model;import java.io.*;public class Account /用户信息 private String userName = ; pri

15、vate String mobilePhone = ; private String email = ; private String phone = ; public Account(String userName,String mobilePhone,String email, String phone) this.userName = userName; this.mobilePhone = mobilePhone; this.email = email; this.phone = phone; private Account() public String getEmail() ret

16、urn email; /(返回email) public void setEmail(String email) this.email = email; public String getMobilePhone() return mobilePhone; /(返回移动电话号码) public void setMobilePhone(String mobilePhone) this.mobilePhone = mobilePhone; /(设置移动电话号码) public String getPhone() return phone; / (返回电话号码) public void setPhon

17、e(String phone) this.phone = phone; / (设置电话号码) public String getUserName() return userName; /(返回用户名) public void setUserName(String userName) this.userName = userName; /(设置用户名) /系列化函数,把该对象序列化为字节流以便在网络中传输 public byte serialize() throws IOException ByteArrayOutputStream baos = new ByteArrayOutputStrea

18、m(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(userName); dos.writeUTF(mobilePhone); dos.writeUTF(email); dos.writeUTF(phone); baos.close(); dos.close(); return baos.toByteArray(); /返回序列化函数,把对象的字节流转化成为对象 public static Account deserialize(bytedata)throws IOException ByteArrayInp

19、utStream bais = new ByteArrayInputStream(data); DataInputStream dis = new DataInputStream(bais); Account account = new Account(); account.userName = dis.readUTF(); account.mobilePhone = dis.readUTF(); account.email = dis.readUTF(); account.phone = dis.readUTF(); bais.close(); dis.close(); return acc

20、ount; /比较两个对象是否匹配,这里用户名匹配就认为两个对象匹配 public static boolean matches(byte data,String userName) throws IOException ByteArrayInputStream bais = new ByteArrayInputStream(data); DataInputStream dis = new DataInputStream(bais); try return (dis.readUTF().equals(userName); catch(IOException e) e.printStackTra

21、ce(); return false; package com.north.phonebook.model;public class ApplicationException extends Exception private Exception exception; private int code = -1; public static final int RECORD_EXIST = 1; public static final int NO_RECORD = 2; public ApplicationException(Exception ex) this.exception = ex

22、; public ApplicationException(int code) this.code = code; public int getCode() return code; public void setCode(int code) this.code = code; public Exception getException() return exception; public void setException(Exception exception) this.exception = exception; package com.north.phonebook.model;im

23、port java.io.*;public class Index private String key; private int recordID; public Index(String key, int recordID) this.key = key; this.recordID = recordID; private Index() public String getKey() return key; public void setKey(String key) this.key = key; public int getRecordID() return recordID; pub

24、lic void setRecordID(int recordID) this.recordID = recordID; /序列化函数 public byte serialize() throws IOException ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(key); dos.writeInt(recordID); baos.close(); dos.close(); return bao

25、s.toByteArray(); /反序列化函数 public static Index deserialize(byte data) throws IOException ByteArrayInputStream bais = new ByteArrayInputStream(data); DataInputStream dis = new DataInputStream(bais); Index index = new Index(); index.key = dis.readUTF(); index.recordID = dis.readInt();bais.close();dis.cl

26、ose(); return index; /匹配两个对象是否相等 public static boolean matches(byte data, String key,int type) throws IOException ByteArrayInputStream bais = new ByteArrayInputStream(data); DataInputStream dis = new DataInputStream(bais); if(type = 101) return (dis.readUTF().equals(key); else if(type = 102) return

27、(dis.readUTF().startsWith(key); return false; package com.north.phonebook.model;import java.io.IOException;import javax.microedition.rms.*;import com.north.phonebook.ui.*;public class Model private RecordStore rs = null; private RecordStore rs_index = null; /定义一个AccountFilter内部类,用它来过滤记录 private stat

28、ic class AccountFilter implements RecordFilter private String userName; public AccountFilter(String userName) this.userName = userName; public boolean matches(byte data) try return Account.matches(data, userName); catch (IOException e) e.printStackTrace(); return false; /定义一个IndexFilter内部类,用它来过滤索引 p

29、rivate static class IndexFilter implements RecordFilter private String key; private int type = 101; public static final int EQUALS = 101; public static final int STARTWITH = 102; public IndexFilter(String key) this.key = key; public IndexFilter(String key,int type) this.key = key; this.type = type;

30、public boolean matches(byte data) try return Index.matches(data, key,type); catch (IOException e) e.printStackTrace(); return false; public Model() throws ApplicationException try rs = RecordStore.openRecordStore(Title.rsName, true); rs_index = RecordStore.openRecordStore(Title.rs_index, true); catc

31、h (RecordStoreException e) throw new ApplicationException(e); public void reOpenRecordStore() throws ApplicationException try rs = RecordStore.openRecordStore(Title.rsName, true); rs_index = RecordStore.openRecordStore(Title.rs_index, true); catch (RecordStoreException e) throw new ApplicationExcept

32、ion(e); /添加索引到索引记录存储rs_index public void addIndex(Index index) throws ApplicationException try byte index_data = index.serialize(); if (rs_index.getNumRecords() 0) RecordEnumeration records = rs_index.enumerateRecords( new IndexFilter(index.getKey(), null, false); if (records.hasNextElement() rs_ind

33、ex.setRecord(records.nextRecordId(), index_data, 0, index_data.length); else rs_index.addRecord(index_data, 0, index_data.length); else rs_index.addRecord(index_data, 0, index_data.length); catch (IOException e) throw new ApplicationException(e); catch (RecordStoreException e) throw new ApplicationE

34、xception(e); /搜素索引 public Index searchIndex(String key) throws ApplicationException try if (rs_index.getNumRecords() 0) RecordEnumeration records = rs_index.enumerateRecords( new IndexFilter(key,102), null, false); int length = records.numRecords(); if (length = 0) return new Index0; else Index inde

35、x = new Indexlength; for (int i = 0; i 0) RecordEnumeration records = rs_index.enumerateRecords(new AccountFilter(key), null, false); Index index = null; if (records.numRecords() = 1) index = Index.deserialize(rs_index.getRecord(records .nextRecordId(); return index; else return null; catch (RecordS

36、toreException e) throw new ApplicationException(e); catch (IOException e) throw new ApplicationException(e); /在记录存储rs_index中删除一条索引 public void deleteIndex(String key) throws ApplicationException try if (rs_index.getNumRecords() 0) RecordEnumeration records = rs_index.enumerateRecords(new IndexFilter

37、(key), null, false); while (records.hasNextElement() rs_index.deleteRecord(records.nextRecordId(); return; catch (RecordStoreException e) throw new ApplicationException(e); /根据userName判断记录是否存在 public boolean isRecordExist(String userName) throws ApplicationException try if (rs_index.getNumRecords()

38、0) RecordEnumeration records = rs_index.enumerateRecords(new IndexFilter(userName), null, false); if (records.numRecords() 0) return true; else return false; else return false; catch (RecordStoreException e) e.printStackTrace(); return true; /在记录存储rs中添加一条Account记录 public void addRecord(Account accou

39、nt) throws ApplicationException try byte data = account.serialize(); int id = rs.addRecord(data, 0, data.length); Index index = new Index(account.getUserName(), id); addIndex(index); catch (IOException e) catch (RecordStoreException e) throw new ApplicationException(e); public void deleteRecord(int

40、recordID) throws ApplicationException /根据userName删除一条记录 public void deleteRecord(String userName) throws ApplicationException try Index index = getIndex(userName); if (index != null) int recordID = index.getRecordID(); System.out.println(recordID); rs.deleteRecord(recordID); deleteIndex(userName); c

41、atch (RecordStoreException e) throw new ApplicationException(e); /清空所有记录 public void clearAllRecord() throws ApplicationException try rs.closeRecordStore(); rs_index.closeRecordStore(); RecordStore.deleteRecordStore(Title.rsName); RecordStore.deleteRecordStore(Title.rs_index); this.reOpenRecordStore

42、(); catch (RecordStoreException e) throw new ApplicationException(e); /根据userName返回对应Account的对象 public Account getAccount(String userName) throws ApplicationException try Index index = getIndex(userName); Account account = null; if (index != null) account = Account.deserialize(rs.getRecord(index.get

43、RecordID(); return account; catch (RecordStoreException e) throw new ApplicationException(e); catch (IOException e) throw new ApplicationException(e); /返回所有索引对象 public Index listRecord() throws ApplicationException try RecordEnumeration menu = rs_index.enumerateRecords(null, null, true); byte data = new byte20; int length = -1; int i = 0; int id = 0; Index index = new Indexrs_index.getNumRecords(); while (menu.hasNextElement() id =menu.nextRecordId(); l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论