-
嵌入式系统课程设计报告
---
学生成绩查询系统手机端
I
摘要
在
21
世纪的今天,互联网已深入世界的各个角落。而
WAP
技术的发展和 无线业务的成
熟
,
为人们获取各种信息提供了除
Internet
之 外的另一种便捷的途径
.
考生成绩查询方式经
历了传统书信通知、电话查询、网上查 询和手机短信查询的几个阶段
,
其中以网上查询方式
最为经济
.
当 前
,
虽然
Internet
达到了前所未有的普及
,
但其终 究受到“有线入户”的限制
,
在广大的农村、不发达地区以及学校学生宿舍还不能很方便的实现 上网
,
而目前的无线通信
网络几乎覆盖了全国每个角落
,
只要有一部 具有
WAP
功能的手机
,
可以不受时间、地域和设备
的限制
,
轻松获取考试成绩
.
因此
,
开发一个使用
WAP
手机查询考试成绩的系统
,
将是对
Internet
查询成绩的一个重要补 充
,
有着巨大的实际意义。
Android
是一个开放的手机平台 ,
从
android
的发布到他的推广,
在短短的时间内以惊人
的速 度占据的大量的智能手机市场。而且将继续扩大其用户量。因此,开发基于
android
的< br>成绩查询系统有其深远的意义。
关键词
:成绩查询;移动设备;
android
。
I
目录
摘要
------------------- -------------------------------------------------- ---------------------------------------- - 2 -
1
、
概述
------------------------- -------------------------------------------------- -----------------------------1
1.1
、项目背景
------------------------------------------------- -------------------------------------------------- 1
1.2
、开发环境
---------------------------- -------------------------------------------------- ---------------------1
2
、
采用的主要方法和 技术
-------------------------------------------- -------------------------------------2
3
、
需求分析
----------------------- -------------------------------------------------- --------------------------4
3.1
、成绩录入
-- -------------------------------------------------- ----------------------------------------------4- < br>3
.
2
、成绩查询
----------------------- -------------------------------------------------- ------------------------4
4
、
设计
------------------------------------------------- -------------------------------------------------- ------6
5
、
系统实现
--------------- -------------------------------------------------- ----------------------------------7
5.1
、欢迎 页
--------------------------------------------- -------------------------------------------------- -----11
5.2
、功能菜单
---------------------- -------------------------------------------------- -------------------------12
5.3
、成绩录入
-- -------------------------------------------------- ---------------------------------------------14 5.4
、成绩查询
-------------------------------- -------------------------------------------------- ---------------17
总结
---------------------- -------------------------------------------------- -------------------------------------21
参考文献------------------------------------------------ -------------------------------------------------- -----22
- 2 -
一、概述
1.1
项目背景
在
21
世纪的今天,
互联网已深 入世界的各个角落。
而
WAP
技术的发展和无线业务的成熟
,
为人们 获取各种信息提供了除
Internet
之外的另一种便捷的途径
.
考生成 绩查询方式经历
了传统书信通知、电话查询、网上查询和手机短信查询的几个阶段
,
其 中以网上查询方式最
为经济
.
当前
,
虽然
Interne t
达到了前所未有的普及
,
但其终究受到“有线入户”的限制
,
在< br>广大的农村、不发达地区以及学校学生宿舍还不能很方便的实现上网
,
而目前的无线通信 网
络几乎覆盖了全国每个角落
,
只要有一部具有
WAP
功能的手机< br>,
可以不受时间、地域和设备的
限制
,
轻松获取考试成绩
.
因此
,
开发一个使用
WAP
手机查询考试成绩的系统
,将是对
Internet
查询成绩的一个重要补充
,
有着巨大的实际意义 。
Android
是一个开放的手机平台,
从
android的发布到他的推广,
在短短的时间内以惊人
的速度占据的大量的智能手机市场。而且将继续 扩大其用户量。因此,开发基于
android
的
成绩查询系统有其深远的意义。
在此基础上,
开发一个使用于学校教务系统配套的学生成绩查询系统手机客户端也具有< br>重要意义。
1.2
开发环境
Windows xp
Android 2.3.1
- 1 -
二、采用的主要方法和技术
此移动客户端主要采用
a ndroid
开发一个适用于
android
系统的客户端。数据库采用
an droid
自带的
sqllite
数据库。
Android
是一个基于
Linux
、
使用
java
作为程序接口的操作系统。
他提供了一些工具,
比如编
译器、调试器、还有他自己的仿真器(
DVM
—
Dalvik Virtual Machine
)
。
Andr oid
是由
领导的
Open Handset Alliance
开发的。
Android
使用的虚 拟机比较特别。
Dalvik
使用了一些特别的方法。
你在
Android< br>上不能运
行普通的
Java
程序。
Android
提供了一个
dx
的工具,可以把普通的
Java
类文件转换为
dex
(
Dalvik Executable
)文件。
Android
程序最后通过
aapt
(
Android Asset Packaging Tool
) 程序
来打包成一个
.apk
文件。
Eclipse
下面的
A DT
可以自动将
class
转换为
dex
,然后在发布的时
候打包成
apk
文件。
Android
支持
2D
和
3D
的
openGL
图形库,支持
SQLi te
数据库。
每一个
Android
程序都运行在
And roid
系统分配的一个独立的空间内,所以每个程序都不
会影响和破坏到其他的程序,这是很 安全的。
Android
对一些任务有特别的许可。例如一个程序需要使用
Internet
,那么就需要在
他的配置文件中获取相应的许可。
在安装过程中,< br>用户可以确认这个程序是否取得相应的许
可。
操作数据库的最佳实践是创建一 个辅助类,
由它封装所有对数据库的复杂访问,
对于调
用代码而言它是透明的,因此我 创建了一个
DBAdapter
的辅助类,由它创建、打开、关闭和
使用
SQ Lite
数据库。
首先,在
src/
文件夹
(
在这个例子中是
src/se)
下添加一个
文件。
在
文件中,导入所有你要使用到的命名空间。
DATABASE_CREATE
常量包括创建
titles< br>表的
SQL
语句。
在
DBAdapt er
类中,你可以扩展
SQLiteOpenHelper
类,它是一个
An droid
辅助类,主要
用于数据库创建和版本管理。实际上,你可以覆盖
onCre ate()
和
onUpgrade()
方法,如清单
2
所示。
在
DBAdapter
类中,扩展
SQLiteOpenHelper< br>类覆盖
onCreate()
和
onUpgrade()
方法
onCreate()
方法创建一个新的数据库,
onUpgrade()
方法用于升级数据库,这可以通过 检
查
DATABASE_VERSION
常量定义的值来实现,对于
onUp grade()
方法而言,只不过是简单地
删除表,然后在创建表而已。
现在你可以定义不同的方法来打开和关闭数据库,添加
/
编辑
/< br>删除
/
行的函数。
- 2 -
定义打开和关闭数据库以及增加
/
编辑
/
删除表中行的方法
注意
Android
使用
Cursor
类返回 一个需要的值,
Cursor
作为一个指针从数据库查询返回
结果集,使用
C ursor
允许
Android
更有效地管理它们需要的行和列,你使用
Co ntentValues
对象存储键
/
值对,它的
put()
方法允 许你插入不同数据类型的键值。
- 3 -
三、需求分析
此查询系统主要实现学生成绩的查询。
学生成绩查询系统
成绩查询 : 2
成绩录入 : 2
按学号查询
按课程名查询
学号课程名联合查询
查询全部
图
1
系统功能图
3.1
成绩录入
成绩录入。对应的输入学生学号、姓名、课程名、成绩。点击保存。
图
2
成绩录入流程图
3.2
成绩查询
成绩查询可以分为按学号查询、按课程名查询、按课程名和学号联合查询、查询全部。
- 4 -
图
3
成绩查询流程图
- 5 -
四、设计
4.1
数据库设计
对应的油三张表:
1
)
、学生表:
PK
Name
True
s_id
False
s_name
False
s_number
False
card
2
)
、课程表:
PK
Name
True
c_id
False
c_name
3
)
、成绩表:
PK
Name
True
s_id
True
c_id
False
score
Type
Not Null
Unique
Len
Prec
Scale
Init
INTEGE
True
False
R
CHAR
False
False
False
False
10
10
CHAR
False
BIGINT
False
Notes
Type
Not Null
Unique
Len
Prec
Scale
Init
INTEGE
True
False
R
CHAR
False
False
10
Notes
Type
Not Null
Unique
Len
Prec
Scale
Init
INTEGE
True
False
R
INTEGE
True
R
FLOAT
False
False
False
0
Notes
图
4 E-R
图
- 6 -
五、系统的实现
Android
应用程序运行的移动设备受限于其运算能力,存储空间,及电池续航 。由此,
它必须是高效的。
电池续航可能是一个促使你优化程序的原因,
即使他看起来 已经运行的足
够快了。
由于续航对用户的重要性,
当电量耗损陡增时,
意味这 用户迟早会发现是由于你的
程序。
虽然这份文档主要包含着细微的优化,
但 这些绝不能成为你软件成败的关键。
选择合适
的算法和数据结构永远是你最先应该考虑的事情, 但这超出这份文档之外。
这份文档是关于
Android规范的细微优化,所以先确保你已经了解哪些代码需要优化,
并且知道如何去衡量你所做修改所带来 的效果(好或坏)
。用开投资开发的时间是有限的,
所以明智的时间规划很重要。
这份文档同时确保你在算法和数据结构上作出最佳选择,
同时考虑了API
选择所带来的
潜在影响。
使用恰当的数据结构和算法比这里的任何建议都有 价值,
考虑
API
版本带来的影
响会如实你选择更好的实现。
当你优化
Android
程序时会遇到的一个棘手问题是确保你 的程序能在不同的硬件平台上
运行。不同版本的虚拟机在不同处理器上的运行速度各不相同。并且不是简 单的设备
A
比
设备
B
快或者慢,
并针对一个设备与其他设备 之间做出排列。
特别的,
模拟器上只能评测小
部分可以在设备上体现的东西。有无JIT
的设备间也有着巨大差异:对于有
JIT
设备好的代
码有时对无< br>JIT
的设备并不是最好的。
如果你想知道程序在设备上的表现,就必须在上面进行测试
对 象创建永远不会免费的。
每个线程的分代
GC
给临时对象分配一个地址池能降低分配< br>开销,但分配内存往往需要比不分配内存高的代价。
如果在用户 界面周期内分配对象,
会强制一个周期性的垃圾回收,
给用户体验造成小小
的停顿间隙 。
Gingerbread
中介绍的并发回收也许有用,但应该避免不必要的工作。
因此,避免创建不需要的对象实例。下面是几个例子:
◆
如果有一个返回
String
的方法,他的返回值通 常附加在一个
StringBuffer
上,改变声
明和实现,这样函数直接在其后面 附加,而非创建一个短暂存在的临时变量。
◆
当从 输入的数据集合中读取数据时,
考虑返回原始数据的子串,
而非新建一个拷贝。
这样你 会创建一个新的对象,但是他们共享该数据的
char
数组。换来的是即使你仅仅使用
原始输入的一部分,你也需要保证它一直存在于内存中。
- 7 -
一个更彻底的观点是将多维数组切割成一维数组:
◆
Int
类型的数组比
Integer
类型的好。
推而广之,
两个平行的
int
数组要比一个
(int,int)
型 的对象数组高效。这个定理对于任何基本数据类型的组合都通用。
◆
如果需要实现存放元组
(Foo,Bar)
对象的容器,
记住两个平行数组
Foo[], Bar[]
会优于一
个
(Foo,Bar )
对象的数组。
(例外情况是:当你设计
API
给其他代码调用时,最好用好 的
API
设计来换取小的速度提升。但在自己的内部代码中,尽量尝试高效的实现。
)
通常来说,
尽量避免创建短时临时对象。
少的对象创建意味着低频的垃圾回 收。
这对于
用户体验产生直接的影响。
如果不需要访问某对象的字段,将方法设置为静态,
调用会加速
15%
到
20%
。
这也 是一
种好的做法,因为你可以通过方法声明知晓调用该方法不需要更新此对象的状态。
在
Android
中,这是个不好的想法。虚方法调用代价比直 接存取字段高昂的多。按照通
常面向对象语言的做法在公共接口中使用
Getters
和
Setters
是有原因的,
但应该在一个经常
访问其字段的类中采用直接 访问。
无
JIT
时,直接字段访问大约比调用无关紧要的
gett er
来访问快
3
倍。有
JIT
时(直接
访问字段开销和访问 局部变量是一样的)
,要快
7
倍。在
Froyo
版本中确实如此,但 以后会
在
JIT
中改进
Getter
方法的内联。
考虑下面类首的声明:
Java
代码
static int intVal = 42;
static String strVal =
我们改进实现,采用
final
关键字:
Java
代码
static final int intVal = 42;
static final String strVal =
类不再需要
clinit
方法,
因为常量进入了
dex
文件中的静态字段初始化器中。
引用
intVal
的代码,
直接调用整形值
42
,
而访问
strVal
时也会采用相对开销较小 的
string constant(
字符
串常量
)
指令 替代字段查找。
(这种优化仅仅是针对基本数据类型和
String
类型常量的,而非
任意的引用类型。但尽可能的将常量声明为
static final
类型是一种好的做法。
改进的
for
循环(有时被称为
for-each
循环)能够用于实 现了
iterable
接口的集合类及
数组中。在集合类中,迭代器促使接口访问hasNext()
和
next()
方法,在
ArrayList
中,计数循
- 8 -
环迭代要快
3
倍(无论有没 有
JIT
)
,但其他集合类中,改进的
for
循环语法和迭代器具有 相
同的效率。优先采用改进的
for
循环,但在性能要求苛刻的
ArrayL ist
迭代中考虑采用手写计
数循环。
考虑下面的定义:
需要注意的关键是:我们定义的 一个私有内部类(
Foo$$Inner
)直接访问外部类中的一
个私有方法和私有变量 。这是合法的,代码也会打印出预期的
Value is 27
。
但问题是虚拟机认为从
Foo$$Inner
中直接访问
Foo的私有成员是非法的,因为他们是两
个不同的类,尽管
Java
语言允许内部类访 问外部类的私有成员,编译器生成几个综合方法
来桥接这些间隙。
内部类会在外部类中任何需要访问
mValue
字段或者
doSt uff
方法的地方调用这些静态方
法。
这意味着这些代码将直接存取成员变量归结为通 过存取器方法访问。
之前提到存取器访
问如何比直接访问慢,这例子说明,某些语言约定导致了 不可见的性能问题。
如果你在高性能的
Hotspot
中使用这些代码,< br>可以通过声明被内部类访问的字段和成员
为包访问权限,而非私有。不幸的是这意味着这些字段会 被其他处于同一个包中的类访问,
因此在公共
API
中不宜采用。
通常的经验是,在
Android
设备中,浮点数会比整型慢两倍,在缺少
FPU
,或是
JIT
的
G1
以及有
FPU
和
JIT
的
Nexus
One
中确实如此(两种设备间算数运算的 绝对速度差大约是
10
倍)
.
速度术语中,在现代硬 件上,
float
和
double
之间并没有不同。更广泛的讲,
d ouble
大
约
2
倍大。在没有存储空间问题的桌面机器中,
dou ble
的优先级高于
float
。
但即使是整型,
有些芯 片拥有硬件乘法,
却缺少除法。这种情况下,整型除法和求模运
算是通过软件实现的,考虑下当 你设计
Hash
表,或是做大量的算术。
本地方法并 不是一定比
Java
高效,至少,
Java
和
native
之间过渡的关联是有消耗的。
而
JIT
并不能越过这个界限进行优化。当你分配本地资 源时(本地堆上的内存,文件说明符
等)
,往往很难实时的回收这些资源。同时你也需要在各个 结构中编译你的代码,而非依赖
JIT
。
甚至可能需要针对相同的架构来编译出不同版 本:
针对
ARM
处理器的
GI
编译的本地代
码,并不能充分 利用
Nexus One
上的
ARM
,而针对
Nexus One< br>上
ARM
编译的本地代码不能
在
G1
的
ARM
上运行。
当存在有你想部署到
Android
上的 本地代码库时,
本地代码显得尤为有用,
而非为了
Java
应用程序的提速。
- 9 -
-
-
-
-
-
-
-
-
本文更新与2021-01-22 19:11,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/551046.html