基于安卓系统地数据库应用_第1页
基于安卓系统地数据库应用_第2页
基于安卓系统地数据库应用_第3页
基于安卓系统地数据库应用_第4页
基于安卓系统地数据库应用_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

吉林大学毕业论文页第1章绪论1.1Android简介坐观当今智能手机系统的发展状况,塞班日渐没落,苹果又过于封闭,WindowsPhone的前途也朴素迷离,而由谷歌公司开发的Android平台近三年来则是发展速度惊人:目前Android系统手机在全球智能手机市场所占份额中已经占据50%以上。尤其是在国外,Android平台受到越来越多的关注,可以说Android平台正处于朝气蓬勃的发展阶段。Android无疑是代表了当前智能行业发展的主流趋势:开放平台日渐取代封闭平台[10]。谷歌也有一个基于Android的愿景:手机将具有在最新的PC机上可用的所有功能。自从2008年9月谷歌公司公布1.0版本以来,经过近五年的跨越式发展,Google公司开发的4.2又在4.1的基础上新增了PhotoSphere全景拍照,键盘滑动手势输入及更聪明的语音输入,单一平板电脑装置多重帐户登录与个人主页,并支持快速切换,Miracast无线显示分享等功能。相信随着时间的推移,2.3及其后续版本会得到越来越多的设备的支持。Android之所以发展如此迅速,与其系统的开放性和免费服务这两点优势是分不开的,Android是一个对第三方软件完全开放的平台,这就允许开发者拥有更大的自由度来开发软件,这一点与其竞争对手苹果公司的iPhone的封闭性截然相反,所以安卓获得了越来越多开发商的支持。而消费者也因此获益而得到Android丰富的软件资源。正是由于Android的开放性和免费服务,Android市场的竞争也日趋激烈,而也正因这激烈的竞争,消费者才可以以满意的价格购买自己喜欢的手机。作为一个开源的项目,Android允许我们充分分析和理解它,以确保其功能得到理解,bug得以修复,有关新功能得到进一步改进,最后,能够移植到新的硬件。在另一方面,它是基于Linux内核的架构模型,还为手机行业增加了Linux的使用,以利用Linux所提供的知识和功能。Android平台由包含了几个层次,它提供了一个完整的软件堆栈。Android应用程序是基于Java的,这个因素促使其必须使用虚拟机的虚拟环境来发挥优势。Android使用其自身叫做Dalvik的虚拟机,在转化Java风格后的字节码后解释和便携式执行它,以优化在移动平台上的操作。所有的这些方面使Android成为可以应用其他类型的环境中一个有吸引力的目标。1.2国内发展现状目前国内的Android开发还处于跟风阶段,其主要发展方向还是应用开发。表1-1清晰描绘出国内Android开发的现状[2]。表1-1国内Android开发现状开发类型开发者盈利方式为企业开发应用一般身处规模比较大的公司主要为自有品牌或者其他品牌设计手机或者平板电脑的总体方案,根据需求对系统进行定制,以及为这些系统编写定制的应用。开发通用应用一般处于创业型公司或者是独立开发者主要是2种:一种是为国外公司进行外包开发,另一种是通过Google的移动广告通过广告点击来分成,理论上是通过付费下载的形式来盈利的,但是现在国内鲜见成功者。游戏开发与开发通用应用状况相似我国在Android开发方面虽投入很多,也取得一些成效,但是在国际上还是处于劣势,在这一方面的劣势,也导致基于Android智能手机或平板电脑的销售不能与世界顶级公司相竞争。而基于Android的记账管理软件开发可以归类于移动应用软件的开发。但国内开发者对基于安卓系统的移动应用软件的研究还比较落后,他们的目的只是单纯的想把这些研究成果推向市场以获得利益,而很少见到真正意义上的由教育机构组织起来的学术性研究团队。因此,对于Android系统的研究机制还不够完善,不同高校的相关研究人员并不能轻易的组成一支合作研究团队。1.3课题研究的意义及目的目前的社会,科技迅猛发展,以智能手机为代表的Android设备越来越受到大众的喜爱,而应用人群也越来越多。学会如何巧妙的运用Android数据库,成为各个IT开发厂商努力竞争的焦点。而若想在Android数据库应用方面取得巨大进展,就需要对其各种操作有深入了解,既要兼顾安全性,又要兼顾效率。若对Android数据库做好研究,就为Android系统的研究打好了基础,对于Android系统其它应用的研究也是帮助很大的。甚至可以说,若想研究好Android系统,就必须做好对Android数据库的研究。而Android记账管理软件便是一款对Android数据库的各种应用发挥的淋漓尽致的软件,这款应用软件上的研究开发也是受到各大开发商家所喜好完善改进的。做好Android记账管理软件,初步实现在Android平台上的记账管理软件的运行,既能对Android开发有进一步的了解,对Android数据库应用有很好的研究,又能做出一款受大众喜爱而又实用的软件。可以说是收到双倍的效用,这对自己的提高也是非常大的。若能在这款软件的开发上能够做到崭露头角,那对Android数据库的研究将会有非常大的促进作用。第2章可行性研究可行性研究是在项目开发前期,基于对正在拟议中的项目进行广泛综合的调查研究,对项目进行的一种考察和鉴定。可行性研究旨在客观,理性的揭示现有或拟建业务的优缺点、时势、威胁以及贯彻所需的资源,并最终取得成功的前景。可行性研究的结果将表明是否进行拟建业务。如果可行性研究的结果是肯定的,那么可以继续合作制定一项业务计划。一般来说,可行性研究要在技术开发和项目实施之前进行。而本软件开发的可行性从以下四个方面来考虑:2.1技术可行性随着Android系统的广泛应用,市场上也出现了越来越多的Android开发工具,我们可以从中找到符合自己要求的工具。而如今对Android程序的开发也简单易学,关于Android程序开发的教材和方法在网络中随处都可以找到,Android应用程序更是种类繁多。安卓记账管理软件的开发程序也是很容易找到的,所以在这些程序中可以借鉴一些方法。而且记账管理软件开发难度也并不算大,个人独立即可完成,所以,开发这个软件具有技术可行性。2.2经济可行性从开始学习Android开发,在书上和网上收集了各种记账管理软件开发的资料,了解到这款软件的开发对计算机硬件没有特殊要求,只需要利用配置好的Eclipse开发工具即可完成开发。因此开发成本可以忽略不计,以及后期维护的费用也是微乎其微的。而且此款软件的功能齐全,适用于多用户,且使用灵活,简单易学,所以开发此软件具有经济可行性。2.3操作可行性在开发此项目的过程中,我一直从一个用户的角度来考虑软件的设计问题。该应用软件设计清晰,有良好的用户界面,操作简洁,对各种可能会出现的bug进行了全面分析和解决,因此有完善的异常处理机制和提示信息机制,用户只要经过几遍使用就可灵活运用,因此操作方面可行。2.4法律可行性本记账管理软件开发不会侵犯到他人、集体或国家利益,且不存在侵权等问题,不会违反国家法律,因此是具有法律可行性的。由以上分析可以看出,对于该软件的开发,通过对其在技术、经济、操作和法律上的研究,均没有不可解决的问题,而且要求不高,本人对Android的开发也有一定的基础,所以该软件的开发是完全可行的。第3章需求规范3.1产品背景随着经济的高速发展,人们的消费水平也越来越高,支出和收入方式也越来越多,而对账单的管理也越来越重要。而现在市场上各式各样的记账管理软件特别多,记账管理软件为用户管理软件提供了非常的大方便,而用户对记账管理软件的日益青睐也恰好满足了这种需求。做一款多用户的记账管理软件也是非常必要的,有需求,就会有市场。3.2产品概述本项目是多用户记账管理软件,完成多用户记账管理功能。本项目的开发环境采用Android的开发语言Java进行开发,采用的工具是Eclipse,同时需要配置Android的SDK,在此基础上完成项目的开发。3.3功能需求用户添加账单查看账单明细删除账单查看账单统计查看消费比例用户添加账单查看账单明细删除账单查看账单统计查看消费比例注册登录图3-1账单管理用例图该项目是对一款多用户记账管理应用软件的开发,即是允许有不同的用户来应用软件来各自管理自己的账单,对账单的操作包括添加账单,查看账单明细,删除账单,查看账单统计以及消费比例图。3.3.1用户管理需求多用户记账管理应用软件,顾名思义,就是允许创建多个用户,在进入该应用软件时,用户可以注册新用户,可以修改密码,也可以查询密码。每个用户有不同的用户名,用户可以利用自己的用户名和对应的用户密码登录进入账单管理系统来管理自己的账单。用户注册用户在注册时,需要输入用户名,登录密码,安全问题和安全问题的答案(这两项是为用户找回密码服务的)。在注册过程中,会有各种检测,来保证用户的正确注册。修改密码用户修改密码,需要正确输入用户名和对应的密码,而后输入新密码和确认密码即可完成修改,当然,在修给密码过程中,也会有检测操作,以保证密码修改的安全性。(3)找回密码用户找回密码,系统会根据用户输入的用户名来查询用户名的存在性及其对应密码,而用户若想获得密码,需要正确回答安全问题的对应答案。这其中也包括必要的检测过程,以保证是用户本人找回自己的密码。3.3.2账单管理需求账单管理包括对账单的基本操作,即添加账单,查看账单明细,删除账单,查看账单统计以及消费比例图。在各个模块中有各种具体的操作。(1)添加账单当用户正确登录时,即进入添加账单这一模块中,账单包括账目类型(有收入和支出的不同选项),账目金额,添加时间以及备注,在添加账单时会有各种输入的检测,以保证账单输入的合理性。(2)账单明细查看账单明细是每次查询各个月的账单列表,用户可以选择不同月份来查看所选月的账单。在此模块中,用户可以很详细的查看自己得历史账单。(3)删除账单在删除账单这一模块中,用户可以选择某一条账单以删除之,在删除后,数据库将彻底删除此条账单。用户在以后查看时将不再存在该条账单。(4)账单统计用户在这一模块中可以通过选择不同月份来查看所选月份的账单统计,此模块清晰明了的统计出当月的各个消费和收入类型对应的金额,以及总消费金额和总收入金额,还有最后的总收入金额。(5)消费比例用户在这一模块中可以通过选择不同月份来查看所选月份的账单消费比例,此模块将所选月份的消费比例以柱状图的形式来呈现出来,以此清晰地比较该月份的消费,以为用户做好消费规划提供很好的依据。3.4性能需求目前市场上记账管理软件多种多样,用户的要求也越来越高,因此,为满足广大用户的需求,本记账管理软件也应具有良好的性能:软件应快速响应用户的操作,不应让用户有过多等待时间。且在录入错误时,系统应给出提示,以保证输入的可靠性。使用本软件的用户需要身份验证,以确保只有合法的用户才能使用本软件,而且也应提供合法性检查功能,对于不合法的操作和异常操作发出警告并取消操作。第4章总体设计经过需求分析阶段的工作,已经知道系统需要做的是什么了,现在是要确定系统应该怎么去做。总体设计又称为初步设计或概要设计,概要设计所要做的就是将需求分析阶段所做的工作转换为软件结构和数据结构。其中软件结构就是将一个复杂系统按功能进行模块划分,以及确定这些模块相互间的关系[4]。本章则介绍系统的软件结构。4.1用户管理系统体系结构用户管理系统用户管理系统用户注册用户登录找回密码修改密码图4-1用户管理系统体系结构图图4-1描绘出在用户管理系统中,包括有用户直接登录、用户注册、用户找回密码和修改密码。选择不同选项会进入不同的操作。账单管理系统账单明细消费比例账单管理系统账单明细消费比例账单统计删除账单添加账单4.2账单管理系统体系结构图4-2描绘出在账单管理系统中,包括有添加账单,查看账单明细,删除账单,查看账单统计和消费比例。4.3系统运行总体流程开开始登录界面用户注册修改密码找回密码用户名和密码正确?账单管理删除账单账单明细添加账单账单统计消费比例退出结束NY图4-3系统运行总体流程图用户在进入系统时,会有登录界面,而在这一界面,用户有四个不同选项,就是用户直接登录、用户注册、用户找回密码和修改密码。选择不同项会进入不同的模块,每个模块都有具体的对应功能。若用户成功登录,则会进入账单管理系统。用户可以添加账单,查看账单明细,删除账单,查看账单统计和消费比例,各个模块都有具体的操作。4.4界面设计一款良好的应用软件应该具有一个美观的且比较友好的交互界面,因此要对该款软件的界面进行精心设计。对于界面设计,首先要有美观的背景,而美观的图片是很容易在网上搜索到的。鉴于所开发的软件属于输入文字和查看模块比较多的,因此应使文字与背景分明,这就要结合开发的软件考虑背景图片的选择。选择好图片后,就要对图片进行设计,以使其真正融合于软件的使用。这可以利用Windows系统自带的画图工具进行裁剪,以使图片大小合适。另外背景图片要做到美观且能突出文字,因此对曝光度和内容还是有一定要求的,这可以使用photoshop进行处理。而界面布局就要在代码设计时,在XML文件中对每一模块进行精心布局设计了。这样就可以满足用户的需要,用户在使用此款软件时也能以良好的心情进行记账管理了。第5章数据库设计谈到应用程序,就要想到其使用的数据,因为应用程序与数据是分不开的。相应的Android应用程序也是要用到数据的,而Android使用SQLite数据库来存储数据。本文所讲述的对Android系统数据库的应用就是对SQLite的操作,在这些操作的基础上来开发一款记账管理软件,因此,在记账管理软件的开发过程中,最重要的就是对数据库的操作,也就是对SQLite的灵活运用,包括数据库的设计和基本的数据库操作:数据库的创建,以及增删改查操作。要创建数据库,首先就要对Android数据库即SQLite有一定的了解。5.1SQLite体系结构及特征作为一款非常流行的嵌入式数据库,SQLite具有开源且与操作系统无关的特性。其体系结构图如下:图5-1SQLite体系结构图接口(Interface)是一个C语言库,它是由API组成,允许多种语言通过接口与SQLite交互,但在实施中其底部是C语言库。当一个SQL语句包含的字符串得到实施后,接口程序将字符串传递给分词器(Tokenizer)。分词器将原始字符串转换成由分析器(Parser)确定的指标,并将这些指标传递给分析器。在分析器收集这些符号后,将它们转换成完整的SQL语句,然后它调用代码生成器生成虚拟机器代码,然后虚拟机代码被交给虚拟机来实现和完成SQL语句[3]。SQLite架构中最核心的部分是虚拟机(VirtualDatabaseEngine,VDBE)。VDBE完成相关数据处理的整个任务,它是客户和存储之间信息交换的中间枢纽。SQLite数据库在磁盘中得到维护,并由B-tree实施,其中B-tree是在btree.c源文件中,通过可调整的页面缓存(pager)快速搜索和访问数据。为了便于移植,SQLite操作系统的接口程序用了一个提取层。实用程序(Utilities)主要融合内存分配,字符串比较,词法分析,在语法分析中的符号表的存储以及专业的打印功能和SQLite的随机数功能。5.2数据库E-R图设计数据库设计是产生一个详细的数据库的数据模型的过程。数据库设计包括逻辑设计和物理设计,其中数据库的逻辑设计即是表结构和表关系的设计,包括所需的实体和关系,实体规范化等工作[8]。数据库的逻辑设计首先要确定反应系统关系的E-R图,而在设计本系统的E-R图时,我完全是从一个用户的角度来考虑软件应用的,如图5-2所示:其中实体users为用户,包含四个属性,即用户ID(userid),用户名(username),用户的安全问题(question)和安全问题对应的答案(answer),用户ID为主键。实体acctitem为账单种类,包含三个属性,即其ID(-ID),分配ID(PID)和种类名(NAME),即是为收入还是支出。_ID为主键。实体bills为账单,拥有7个属性,即账单ID(-id),账单从属id(acctitemid),用户从属id(userid),账单金额(fee),账单日期(sdate),账单时间(stime)和必要的备注(desc),同样的账单ID为主键。这其中每个bills的acctitemid与acctitem的PID性质是相同的,即是每个账单都有一个账单种类。同样的,bills中的userid与users中的userid性质也是相同的,即是每笔账单都必是某个用户的。usersusersmanagebillsacctitemincludeuseridusernamequestionanswer_IDPIDNAMEuseridacctitemiddesc_idsdatestimefee图5-2系统E-R图5.3数据库关系模式设计根据E-R图可以创建关系模式:users(userid,username,question,answer)acctitem(_ID,PID,NAME)bills(_id,acctitemid,userid,fee,sdate,stime,desc)在设计关系模式过程中,很明显在E-R图中的两个联系没有设计成关系模式,其实是为了操作简单,把关系manage以及关系include和实体bills合并了。因此最终生成的是上述的三个关系模式。5.4数据库表结构根据所设计的关系模式,很容易创建关系表,表结构如下:5.4.1用户表表5-1用户表字段名称字段类型是否主键备注useridInteger是用户ID为自增usernameTEXT否用户名questionTEXT否安全问题answerTEXT否答案该表记录用户的信息,用户在成功注册后,其信息就保存在该表中。主键userid是自增的,即每成功注册一个用户,userid就会自动加1。5.4.2账单种类表表5-2账单种类表字段名称字段类型是否主键备注_IDinteger是账单种类IDPIDInteger否账单种类分配IDNAMETEXT否账单种类名该表记录账单种类信息,其实账单种类只有两种,即是收入或支出,因此其可以分配的种类即为两种,PID也只有两个数据,可以设为0和1,以区别收入和支出。5.4.3账单信息表表5-3账单信息表字段名称字段类型是否主键备注_idInteger是账单ID为自增的acctitemidinteger否账单从属IDuseridinteger否用户从属IDfeeinteger否账单金额sdatereal否账单日期stimeTEXT否账单时间descTEXT否账单备注该表记录账单的信息,账单从属ID是表示为收入还是支出,账单用户从属ID是标示为属于哪一个用户的。而且_id也是自增型的,也即是用户每成功添加一笔账单,该账单的id都会自动在原来的基础上加1。5.5数据库的创建数据库表结构已经创建完毕,就可以在实现代码创建数据库了。首先在创建数据库类中实现数据库创建的前期过程:privatestaticfinalStringTAG="account_BilldbHelper";privatestaticfinalStringDATABASE_NAME="account.db";SQLiteDatabasedb;Contextcontext;BilldbHelper(Context_context){ context=_context; db=context.openOrCreateDatabase(DATABASE_NAME,0,null); Log.v(TAG,"dbpath="+db.getPath());}从代码中可以看出,数据库名为account.db,然后在这个数据库中,创建各个表。5.5.1账单种类表的创建publicvoidCreateTable_acctitem(){ try{ db.execSQL("CREATETABLEacctitem(" +"_IDINTEGERPRIMARYKEY," +"PIDinteger," +"NAMETEXT" +");"); Log.v("Account","CreateTableacctitemok");}catch(Exceptione){ Log.v("Account","CreateTableacctitemerr,tableexists.");}}调用此函数即可创建账单种类即acctitem表。5.5.2用户表的创建publicvoidCreateTable_user(){ try{ db.execSQL("createtableusers(useridINTEGERPRIMARYKEYAUTOINCREMENT,usernameTEXT,passwordTEXT,questionTEXT,answerTEXT);"); Log.v("Account","CreateTableusersok"); } catch(Exceptione) { Log.v("Account","CreateTableuserserr,tableexists."); }} 调用此函数,即可实现用户表即users表的创建。5.5.3账单信息表的创建publicvoidCreateTable_bills(){ try{ db.execSQL("CREATETABLEbills(" +"_idINTEGERprimarykeyautoincrement," +"acctitemidinteger," +"feereal," +"useridinteger," +"sdateTEXT," +"stimeTEXT," +"descTEXT" +");"); Log.v("Account","CreateTablebillsok");}catch(Exceptione){ Log.v("Account","CreateTableacctitemerr,tableexists.");}调用此函数,即可实现账单信息表即bills表的创建。5.5.4各个表的生成过程publicvoidFirstStart(){ Cursorcursor=null;try{Stringtable="users"; Stringsql="selectcount(*)ascfromSQLite_masterwheretype='table'andname='"+table.trim()+"'";cursor=db.rawQuery(sql,null);if(cursor.moveToNext()){intcount=cursor.getInt(0);if(count>0){ System.out.println("已经存在用户表!");}else{ CreateTable_acctitem(); CreateTable_user(); CreateTable_bills(); InitAcctitem();}}}catch(Exceptione){ CreateTable_acctitem(); CreateTable_bills(); CreateTable_user(); InitAcctitem();}}在系统初始时,会调用此函数以判断数据库是否存在uses表,若没有,就会调用三个表的创建函数以创建表。若已经存在,说明三个数据表已经被创建过,所以不需要创建了,只需向后台输出信息就行。第6章详细设计及系统实现详细设计是软件工程中软件开发的另一个重要步骤,就是对总体设计进行细化。该系统的详细设计是开始实施前的最后一个设计活动。详细设计最难的解决的就是设计要详细或设计是不完整的。与源代码相比,详细设计仍然是一个抽象的概念,但应当足够详细,以确保源代码的翻译源是一个粗略的解释,而不是一个精确的映射。Android应用程序对应的每个模块都会有一个Activity来实现其功能。本系统是基于Android系统的应用软件,当然是要利用Activity来实现不同模块之间的跳转以及传递信息,以很好地实现模块之间的切换以及关联性。6.1用户管理模块设计6.1.1用户登录模块用户开启软件时,会首先进入登录界面(图6-2),如图6-1流程所示:需要输入用户名和密码,若用户没有输入用户名或密码而点击确认按钮,系统会给出提示请用户输入。在用户两者都输入时,系统会检测用户名是否存在,若不存在会提醒用户用户名不存在,回到登录界面;若用户名存在,系统会接着检测用户名是否和密码匹配,若不匹配,系统会提醒用户密码错误,并回到登录界面;若用户名和密码匹配,系统会进入该用户的账单管理系统,用户可以进行账单管理的各种操作。在这一模块对应的Activity中设置有menu选项,由图可以看出分别为注册新用户,找回密码和修改密码,每个模块都会有相应的输入检测,以保证输入的正确性和系统数据的健壮性,也便于用户的管理,用户点击不同选项会进入不同界面。开开始登录界面用户名是否存在?密码是否正确?进入账单管理系统YYNN退出结束图6-1用户登录流程图图6-2用户登录界面而在这一模块中,涉及到数据库的查询,需要查询用户名和密码。其中查询用户名的代码如下:publicbooleanisexist(Stringname){ //TODOAuto-generatedmethodstub Cursorc=db.query("users",newString[]{"userid"},"username=?",newString[]{name},null,null,null); intnum=c.getCount(); if(num>0) returntrue; elsereturnfalse; }利用query查询语句来查询由参数name传递的用户名对应的uesrid,然后再对查询到的结果进行统计,若存在,其总数肯定大于零,于是返回真;若不存在,其总数则会为零,返回假。如此就能判断出用户名的存在性。同时也会用到查询密码的代码:publicStringgetPass(Stringname){ Cursorc=db.query("users",newString[]{"password"},"username=?",newString[]{name},null,null,null); c.moveToFirst();Stringpassword=null;while(!c.isAfterLast()){ password=c.getString(0);c.moveToNext();}c.close();returnpassword;}这段代码所做的也是要查询数据库,利用query查询语句来查询由参数name传递的用户名对应的password,然后将得到的password返回,再在调用此函数的函数与得到的结果进行比较,若两者相同,则密码正确。两者不相同,密码错误。6.1.2用户注册模块开开始注册界面是否输入用户名?用户名是否存在?登录验证YYNN结束是否输入密码?NNYY确认密码是否与密码一致?是否输入安全问题NNYY是否输入答案?图6-3用户注册流程图用户在进入注册界面时(图6-4),如图6-3流程所述,要求输入用户名,密码,确认密码,安全问题和答案。图6-4注册界面点击确认按钮时,系统首先会检测用户名是否已输入,若没有输入,系统会给出提示让输入用户名并回到注册页面。若输入,系统会检测用户名是否已存在,以保证用户名唯一,若用户名已经存在,系统会提示用户名已经存在,若用户名不存在,则用户名可用。然后系统会检测是否输入密码,若没有输入,系统会提示输入密码,若已经输入,系统会检测密码是否与确认密码相同,若不相同,系统会提示密码与确认密码不相同,以保证用户确实输入的是自己想要的密码。若两者相同,系统会接着检测是否输入安全问题,若没有输入,系统会给出提示让输入安全问题,若输入,则系统会检测是否输入安全问题对应的答案,若没有输入,系统同样会提示让输入答案,这两项是为用户找回密码服务的。若已经输入答案,系统会给出提示说明注册成功,然后进入登录界面以验证是否能够正确登录。如同登录模块,在这一模块中对应的Activity也需要检测用户名的存在性,用到用户名的查询代码。当各个输入都符合要求时,则会用到数据库的插入操作。插入函数如下:publicbooleanUsers_save(Stringname,Stringpass,Stringque,Stringans){Stringsql="";try{sql="insertintousersvalues(null,'"+name+"','"+pass+"','"+que+"','"+ans+"')"; db.execSQL(sql); returntrue; } catch(Exceptione){ returnfalse; }}利用数据库插入语句,把users各种属性信息插入数据库,其中,插入语句中有一个参数是为null,是因为这个参数对应的属性为userid,是自增型的,即自动加1的,因此不需要输入参数。6.1.3修改密码模块修改密码界面修改密码界面用户名是否存在?原密码是否正确?YYNN结束确认密码是否与密码一致?是否输入新密码?YNNN是否输入用户名?YN开始图6-5修改密码流程图用户在进入修改密码界面(图6-6)时,如图6-5,若点击确认,系统会首先检测是否输入用户名,若没有输入用户名,系统会给出提示让输入用户名,若输入用户名,系统会检测用户名是否存在,若不存在,系统会给出提示用户名不存在,若用户名存在,系统会检测原始密码是否正确。若原始密码不正确,系统会给出提示原始密码错误,若原始密码正确,系统会接着检测是否输入新密码。若没有的输入新密码,系统会给出提示要求输入新密码,若已经输入新密码,则系统会检测新密码与确认密码是否能相同,以保证用户要修改的密码确实就是自己需要的密码。若新密码与确认密码输入的相同,则系统会提示修改成功。图6-6修改密码界面在这一个模块对应的Activity中,也会用到用户名的查询,需要查询数据库是否存在输入的用户名。如果存在,还要根据用户名查询其对应的密码。若最后的输入都合法,则会用到对数据库信息进行修改的函数:publicbooleanchangePass(Stringname,Stringpass){ try{ Log.v("changePass","usersokusername="+name+"password="+pass); db.execSQL("updateuserssetpassword='"+pass+"'whereusername='"+name+"'"); Log.v("Account","usersokusername="+name+"password="+pass); returntrue; }catch(Exceptione) { returnfalse; }}即是利用update语句来修改用户的密码,在主函数中调用这个函数即可修改密码。6.1.4找回密码模块用户有可能忘记自己的密码,因此系统给出了这一模块。在这一模块中,在登陆界面,如图6-7流程所示:需要先输入用户名,点击确认时,待系统检测用户名存在时,系统进入找回密码界面(图6-8),此界面系统会给出用户名对应的安全问题,用户需要回答安全问题才有可能获得密码。若用户给出的答案不是正确答案,系统会给出提示答案错误,若答案正确,系统会把用户名对应的密码给出,用户即可获得登录密码。开开始找回密码界面用户名是否存在?答案是否正确?YNN结束登录界面是否输入用户名?NYY给出密码图6-7找回密码流程图在这一Activity中,会用到另一查询函数,在数据库中查询用户名对应的安全问题和对应的答案。代码如下:publicString[]getQA(Stringname){ Cursorc=db.query("users",newString[]{"password","question","answer"},"username=?",newString[]{name},null,null,null); c.moveToFirst(); Stringuser[]={"","",""}; while(!c.isAfterLast()){ user[0]=c.getString(0); user[1]=c.getString(1); user[2]=c.getString(2); c.moveToNext(); } c.close(); returnuser;}图6-8找回密码界面这一模块中多使用的getQA(Stringname)查询函数也是主要利用query语句,根据用户名在数据库中查询信息。并将查询结果添加到一个字符串数组中,如此返回,在调用这个函数的主函数中进行比较,若答案正确,会调用找密码函数,即getPass(Stringname)函数,然后系统会将密码信息输出告知用户密码。6.2账单管理模块在账单管理这一大模块中,最重要的一步是要各个模块所操作的账单是登录用户的信息,因此要用到全局变量,以保证让每个账单管理模块都是同一个用户的操作。在设计时,就用到Application来保存全局变量,其代码如下:importAndroid.app.Application;publicclassLiveUserextendsApplication{ privateintuserid;publicintgetid(){ returnuserid;}publicvoidsetid(intid){userid=id;}}在用户成功登录时,系统会将用户对应的userid调用上述函数的setid(intid)函数来将此类的userid的设置为用户id,然后在账单管理模块的每个模块中都会调用getid()函数来得到这个全局变量的值,从而每个模块操作的都是同一个用户的账单信息。6.2.1添加账单模块开始开始添加账单界面是否选择账目类型?是否输入费用?重新设置日期和时间确认或退出YY确认NN结束退出添加备注图6-9添加账单流程图用户在成功登录后,会进入添加账单界面(图6-10),在这个界面,用户点击账单类型,会有收入和支出的各个类型供用户选择,若用户没有选择账单类型而点击确认,如图6-9流程所示,系统会给出提示让用户选择一种账单类型,若用户在选择类型后,而没有填写消费金额,则系统同样会给出提示让用户输入消费金额,用户输入消费金额后,即可选择添加账单。同时,在这一界面添加账单时,默认时间是添加账单当天的日期和时间,用户可以自由选择时间,同时账单的备注也是自由填写的。当账单信息输入完毕后,用户选择确认,系统会给出提示添加成功,并回到添加界面等待添加新的账单。若选择退出,则会退出添加账单系统,回到登录界面。图6-10添加账单在这一Activity中,会用到数据库插入函数,在账单表中插入新的信息。代码如下:publicbooleanBills_save(intacctid,floatfee,intuserid,Stringdate,Stringtime,Stringtext){ Stringsql=""; try{sql="insertintobillsvalues(null,"+acctid+","+fee+","+userid+",'"+date+"','"+time+"','"+text+"')"; db.execSQL(sql); Log.v("Account","insertTablebillsok"); returntrue; }catch(Exceptione){ Log.v("Account","insertTablebillserr="+sql); returnfalse;}}根据代码可以看出,函数是利用insert语句来实现将数据添加到数据库的。因此操作函数并不算复杂。6.2.2账单明细模块而查看账单明细基本上没有什么流程,在添加账单界面时,用户选择进入账单明细,系统就会进入账单明细这一界面(图6-11),在这一界面中,系统会自动将当月的账单明细以列表的形式展现出来。用户也可以选择其他月份,系统同样可以将用户所选月份的账单明细以列表形式展示出来。在这一模块中,涉及到的Activity会用到账单信息的查询,查询函数的代码如下:publicCursorgetBills(Stringdate,intuserid){ Log.v("Account","rungetbillscursordate="+date+"userid"+userid); returndb.query("billsa,acctitemb",newString[]{"a._id_id","a.rowidrowid","acctitemid","name","b._idbid","(casewhenpid=0then'-'else''end)||fee/100||''fee","sdate||''||stimesdate","desc"},"a.acctitemid=b._idanda.sdatelike'"+date+"%'anda.userid='"+userid+"'",null,null,null,null); }图6-11账单明细界面可以看出这个查询函数的查询语句相对来说比较复杂,要将账单的各个信息输出,还要满足一定的条件,条件就是属于某个日期和某个用户,然后以一定的格式返回。6.2.3删除账单模块图6-12删除账单界面在账单明细界面中,用户可以选择某一条账单以删除之,系统会弹出对话框,以给出提示(如图6-12),在删除后,数据库将彻底删除此条账单,同时界面将更新显示删除账单后的结果,而且用户在以后查看时将不再存在该条账单。显然删除账单模块,会用到删除函数,此函数非常简单,只是利用delete语句来删除对应_id的账单。其代码如下:publicvoiddelBills(intid){db.execSQL("deletefrombillswhere_id="+id);}6.2.4账单统计模块图6-13账单统计界面用户在进入账单统计界面后(图6-13),系统会将当月的账单统计展现出来,在这一界面中,系统清晰明了的统计出当月的各个消费和收入类型对应的金额,以及总消费金额和总收入金额,还有最后的总收入金额。同时,用户也可以通过选择不同月份来查看所选月份的账单统计。在这一模块中,显然要用到数据库的查询函数,而且在查询的过程中,要用到对各种账单金额的统计,代码如下:publicfloat[]getEachTotal(Stringdate,intuserid){ Log.v("Account","rungeteachbilltotalcursor"); Cursorcur=db.query("billsa,acctitemb",newString[]{"sum(casewhena.acctitemid=3then-feeend)/100||''products","sum(casewhena.acctitemid=4then-feeend)/100||''Electricty","sum(casewhena.acctitemid=5then-feeend)/100||''Water","sum(casewhena.acctitemid=6then-feeend)/100||''Gas","sum(casewhena.acctitemid=9999then-feeend)/100||''Others","sum(casewhena.acctitemid=2thenfeeend)/100||''Wages","sum(casewhenb.pid=1thenfeeend)/100||''infee","sum(casewhena.acctitemid=7thenfeeend)/100||''bonus","sum(casewhenb.pid=0then-feeelsefeeend)/100||''total"},"a.acctitemid=b._idanda.sdatelike'"+date+"%'anda.userid='"+userid+"'",null,null,null,null); cur.moveToFirst(); floattotal[]={0,0,0,0,0,0,0,0,0,0}; while(!cur.isAfterLast()){ total[0]=cur.getFloat(0); total[1]=cur.getFloat(1); total[2]=cur.getFloat(2); total[3]=cur.getFloat(3); total[4]=cur.getFloat(4); total[5]=total[0]+total[1]+total[2]+total[3]+total[4]; total[6]=cur.getFloat(5);//wagestotal[7]=cur.getFloat(6);//income total[8]=cur.getFloat(7);//bonus total[9]=cur.getFloat(8); cur.moveToNext();} returntotal;}这个查询函数中的查询语句相对来说是比较复杂的,因为在query语句中,对最后的查询结果还要用sum进行统计,而且要满足一定的条件,最后再将最终结果传递到一个数组中返回。6.2.5账单消费比例模块图6-14消费比例界面用户在将要进入这一模块前,需要选择不同月份来查看所选月份的账单消费比例,此模块将所选月份的消费比例以柱状图的形式来呈现出来,每一种消费都对应一个柱形,如图6-14所示,以此清晰地比较该月份的不同消费。在这一模块中,仍会用到上一模块中介绍到的getEachTotal(Stringdate,intuserid)函数,然后将各个消费与总消费相比,得到其所占比例,再传递到显示柱状图形的函数中,以柱状图的形式显示各个消费的比例大小。第7章系统测试系统测试就是对一个完成的集成的系统进行测试,以评估其是否符合规定的要求,并找出与需求规格不相符合或是与之矛盾的地方,在此基础上提出更加完善的方案。系统测试属于黑箱测试的范围内,因此,不需要代码的内部设计或逻辑知识。测试人员通常尝试通过输入可能会导致系统出现故障或返回不正确的信息的数据,以“打破制度”,通过此种方式来查找系统漏洞以修复和完善系统功能。系统测试包括功能测试和健壮性测试:其中功能测试即是测试软件系统的各项功能运行是否准确,以保证软件功能的正确性,而健壮性测试则是测试软件系统对异常操作所拥有的容忍度。健壮性包括两层含义,即容错能力和恢复能力[1]。在本系统的测试中,是在开发过程中不断测试的,在开发过程中不断测试发现问题并解决问题,在最后开发结束时,再进行整体测试,以保证软件功能各个功能模块的正确性以及整体的健壮性。7.1登录系统模块测试表7-1登录系统模块测试功能特性用户身份验证测试目的验证是否输入合法的信息,允许合法登录,阻止非法登录测试数据用户名=3333密码=123456操作步骤操作描述数据期望结果实际结果测试状态1不输入用户名称,按“登录”。给出提示系统提示“输入用户名”正常续表7-1登录系统模块测试2输入错误用户名,按“登录”。用户名为2233密码为123456给出提示系统提示“用户名不存在”正常3不输入密码用户名为3333给出提示系统提示“请输入密码”正常4输入正确用户名,错误密码用户名为3333,密码为1234给出提示系统提示“密码错误”正常5输入正确用户名和密码用户名为3333,密码为123456登录登录正常7.2注册用户模块测试表7-2注册用户模块测试功能特性用户注册测试目的验证是否输入合法的信息,允许合法注册,阻止非法注册测试数据已存在用户名=3333操作步骤操作描述数据期望结果实际结果测试状态1不输入用户名称,按“确认”。给出提示系统提示“输入用户名”正常2输入已存在用户名,按“登录”。用户名为3333给出提示系统提示“用户名已存在”正常3不输入密码用户名为2233给出提示系统提示“请输入密码”正常续表7-2注册用户模块测试4输入用户名,错误和确认密码不一致用户名为2233,密码为1234,确认密码为123给出提示系统提示“密码和确认密吗不一致”正常5输入用户名和密码,确认密码,不输入安全问题用户名为2233,密码为1234,确认密码为1234给出提示系统提示“请输入安全问题”正常6输入用户名,密码,确认密码和安全问题,不输入答案用户名为2233,密码为1234,确认密码为234,安全问题uu给出提示系统给出提示“请输入答案”正常7输入用户名,密码,确认密码和安全问题及答案用户名为2233,密码为1234,确认密码为1234,安全问题为uu,答案为uu。注册成功注册成功,系统给出提示“注册成功”正常7.3找回密码模块测试表7-3找回密码模块测试功能特性找回密码测试目的验证是否输入合法的信息,能否找回密码。测试数据用户名=3333密码=123456安全问题=1234答案=5678操作步骤操作描述数据期望结果实际结果测试状态1不输入用户名称,按“找回密码”。给出提示系统提示“输入用户名”正常续表7-3找回密码模块测试2输入错误用户名,按“找回密码”。用户名为2233给出提示系统提示“用户名不存在”正常3输入用户名称,按“找回密码”。用户名为3333跳转界面系统跳转到找回密码界面正常4进入找回密码界面后,不输入答案,按“确认”给出提示系统提示“请输入答案”正常5进入找回密码界面后,输入错误答案答案为1234给出提示系统提示“答案错误”正常6进入找回密码界面后,输入正确答案答案为5678给出密码给出密码“您的密码为123456”正常7.4修改密码模块测试表7-4修改密码模块测试功能特性修改密码测试目的验证是否输入合法的信息,能否正确修改密码,阻止非法修改。测试数据用户名=3333密码=123456操作步骤操作描述数据期望结果实际结果测试状态1不输入用户名称,按“确认”。给出提示系统提示“输入用户名”正常续表7-4修改密码模块测试2输入错误用户名,按“找回密码”。用户名为2233给出提示系统提示“用户名不存在”正常3输入用户名和错误原始密码,按“确认”用户名为3333密码为1234给出提示系统提示“原密码错误”正常4输入用户名和原始密码,不输入新密码用户名为3333原始密码为123456给出提示系统提示“请输入新密码”正常5输入用户名和原始密码,输入新密码,但新密码和确认密码不一致用户名为3333原始密码为123456新密码为1234确认密码为2345给出提示系统提示“新密码和确认密码不一致”正常6输入用户名和原始密码,输入新密码,新密码和确认密码,且一致用户名为3333原始密码为123456新密码为1234确认密码为1234修改成功修改成功,且给出提示“修改成功”正常7.5添加账单模块测试表7-5添加账单模块测试功能特性添加账单测试目的验证是否输入合法的信息,允许合法添加账单,阻止非法添加测试数据续表7-5添加账单模块测试操作步骤操作描述数据期望结果实际结果测试状态1不选择账单类型,按“确认”。给出提示系统提示“请选择账单类型”正常2选择账单类型,不填入金额,按“确认”账单类型选择“电费”给出提示系统提示“请输入金额”正常3选择账单类型,填入金额,按“确认”账单类型为“电费”,金额为1234.89成功添加添加成功,并给出提示“添加成功”正常4选择账单类型,填入金额,选择日期和时间,按“确认”账单类型为“水费”,金额为1534.79成功添加添加成功,并给出提示“添加成功”正常5选择账单类型,填入金额,添加备注,按“确认”账单类型为“

温馨提示

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

评论

0/150

提交评论