Android开发(七)| “我的12306”实例

2018年6月20日20:54:49 发表评论 1,211 人围观

作为程序员,从一无所知开始接触、熟练使用android控件、布局、活动,自己开发的项目随之越来越茁壮,功能越来越完善,我们的内心是由衷感到高兴的。

为了对两个月的学习成果有一个检验,我把之前所学所讲做了如下的综合实例;如果能对其他热爱android开发的朋友有所帮助,那简直是再好不过。这也是我写android开发系列文章的初衷。

这个实例取名“我的12306”,顾名思义源自12306火车订票系统,实现了原版的部分功能。如简单的车票预订:

Android开发(七)| “我的12306”实例
购票

基本的线路查找:

Android开发(七)| “我的12306”实例
查询线路

列车详细信息:

Android开发(七)| “我的12306”实例
车次详情

学习过程中借鉴一些优秀实例,既是对编程开发能力的锻炼,也利于活跃思维,有助于今后开发自己的创新产品。

这一章就来简明扼要的说明该实例的功能和开发过程。

一、实现基本的车次查询

Android程序的设计讲究逻辑和视图分离,最好一个活动对应一个布局,用来显示界面的内容。所以本实例都是通过修改 .xml中的代码,完成界面的布局。再在activity中加入逻辑实现的代码。

如下是第一个界面,具体布局代码应该可以直接略过了,稍值一提的是“最近常用线路”往往不只一条,所以把它们存放在ListView中,方便用户随时调用。

Android开发(七)| “我的12306”实例
储备了多条常用线路 方便用户选择

关于Android号称最难使用的控件ListView,您可以上网查阅资料或参考《android开发二 | 最常用和最难用的控件》我们需要为ListView定义一个适配器(如 ArrayAdapter),将希望传入显示的数据和ListView关联起来;同时定义一个实体类,作为适配器的适配类型。

关于查询界面,先给出点击“查询”跳转的响应代码,如需完整代码您可以在文末留言或私信“叶琛_”。这儿的常用线路我通过SharedPreferences存储、读取,因为简单方便。

Android开发(七)| “我的12306”实例
“查询”跳转按钮

跳转后显示符合条件的车次。从本界面开始的数据读取、写入,都是是通过android系统内置的数据库SQLite实现的。

我已在数据库中建了三张表,分别存放①列车(车次、起点、终点)、②列车详细信息(车次、时间、停靠站、票价等)、③票务管理(车次、余票等),用于实现“12306”的基本功能。表中变量车次是唯一的,即每张表通过车次关联。

可以在dos界面下使用adb shell对数据库和表的创建情况进行检查。

现在,假设在起点、终点分别输入“拉萨”和“北京西”,点击查询后就会从数据库逐条读取出符合条件的车次:

Android开发(七)| “我的12306”实例

我们要的结果出来了,每条记录对应于①列车这张表我暂时在表中插入两班车所以只有两条记录。

二、实现车次的新增和查找

上一界面还有两个蓝色按钮,分别为增添和查找功能。增添,就是往表中插入数据;点击后,可按提示文字对新车次进行编辑:

Android开发(七)| “我的12306”实例
新增车次编辑

填写完成后,点击“确定”,执行如下代码,通过SQL语句向三张表插入数据并弹出“增加成功”的提示语:

Android开发(七)| “我的12306”实例

至于“查找”就更简单了,点击后页面跳转,输入车次后,会通过Cursor对象与表中内容进行匹配,如果存在,就会在列表中显示列车信息;否则提示“车次不存在”并返回上一界面。

Android开发(七)| “我的12306”实例
Android开发(七)| “我的12306”实例
通过cursor匹配表中信息

三、实现增删改和停靠站间的线路查询

之前的界面,还有一个编辑按钮没有用到。其实这个按钮经过设置没有实际功能,仅提示点击具体班车再进行后续步骤。

Android开发(七)| “我的12306”实例

我们以“G501”为例,点击后显示出本班车的具体信息,包括行驶时间、停靠站、车票等,对应于表列车详细信息”

Android开发(七)| “我的12306”实例
列车详情

这个界面显示的信息相对比较全面了,它包含了三个功能:购票、编辑和删除。“删除”是最简单的,它将执行SQL的“delete”语句,在后台三张表中这班车的信息就会全部删光。

Android开发(七)| “我的12306”实例
删除车次

在“编辑”中我写入了增加停靠站功能。新增后,加入的停靠站会被显示在列表末尾,序列号自动+1。我们在“拉萨”到“北京西”间增加一站“石家庄”,再查看G501列车:

Android开发(七)| “我的12306”实例
Android开发(七)| “我的12306”实例
停靠站新增

通过SQL语句“update”更新表,将数据增添:

Android开发(七)| “我的12306”实例

“购票”功能将放在下一节。现在,还有一个隐含功能没有体现,就是不同城市间的线路查询。假设我们要查询“西宁“到“石家庄”的列车,那"G501"肯定包含其中,因为这两站都是它的停靠站。

Android开发(七)| “我的12306”实例

进入列车详情,停靠站自然只剩了两站:

Android开发(七)| “我的12306”实例

这个功能的实现,需要遍历算法的支持。即输入起点、终点后先遍历数据库,判断有没有列车的起始站、终点站刚好与之相等。若有直接取出;若无,再遍历查找起始站等于“起点”,停靠站等于“终点”的列车...

排查范围依次增大,最大范围就是起点和终点都是同一班车的两个停靠站,否则就没有符合条件的车次了。附上遍历算法的android代码:

Android开发(七)| “我的12306”实例
便利查询算法
Android开发(七)| “我的12306”实例
接上页

这一功能的实现,标志我们的项目和实际应用又近了一步,是很好的趋势。

四、实现票数的销售

这一步是最困难的,因为要考虑的因素很多。例如一班车从北京经南京开往上海,现在卖出了一张北京到上海的全程车票,这是最理想的;但如果卖出了一张北京到南京的车票,那有人想从北京去上海,就买不到这张票了;除非有人买下南京到上海的车票,不然这个位置就被闲置浪费了。

时间仓促,本案例中我没有完整写出正常售票的算法,只实现购买全程车票的情况。

还是拉萨到北京西的例子,假设某人购买了一张“商务座”,原来商务座余票2张,购票成功后余票变为1。依旧通过SQL语句实现表中数据的更新。

Android开发(七)| “我的12306”实例
Android开发(七)| “我的12306”实例
Android开发(七)| “我的12306”实例

本案例所有功能、步骤到此介绍完了,关键部分代码已给出。当然部分功能是不全或有缺陷的,这说明我们学习的道路依旧路漫漫其修远,蕴藏着很大的潜能。


本章小节:

本实例是对之前android知识的综合运用,涉及基本控件、布局、活动的跳转、数据的传递,也充分运用了android内置数据库的查询、更新、添加、删除各个功能,还对SQL语句进行了很好的回顾。

通过今后学习,改进一些算法使功能更加完善,再加上网络和多线程技术,我们的应用就蛮像一回事了。“编程尚未成功,大伙仍需努力。”

作者:叶琛_
原文链接:https://www.jianshu.com/p/7b7d90be3f38

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: