【《一个基于安卓平台的血压监测与分析系统设计》12000字(论文)】_第1页
【《一个基于安卓平台的血压监测与分析系统设计》12000字(论文)】_第2页
【《一个基于安卓平台的血压监测与分析系统设计》12000字(论文)】_第3页
【《一个基于安卓平台的血压监测与分析系统设计》12000字(论文)】_第4页
【《一个基于安卓平台的血压监测与分析系统设计》12000字(论文)】_第5页
已阅读5页,还剩31页未读, 继续免费阅读

下载本文档

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

文档简介

PAGE8一个基于安卓平台的血压监测与分析系统设计摘要在不断发展的当今时代,血压疾病一直是困扰人类的一大疾病种类。它不像其他疾病一样有着独特的症状,很多人都在不知不觉中患有血压疾病。这就导致了我国国内有着数量众多的血压疾病患者,他们都需要每天按时服用各种药物。这些药物有着不同的服药时间和剂量,一些患者经常记不住自己应该服用的药物。本文的主要工作是实现一个基于安卓平台的血压监测与分析app,该app的主要功能有定时闹钟提醒、血压数据录入与折线图显示、服药历史记录记录与显示。软件使用了java语言在androidstudio平台开发,通过sql数据库来储存数据。主要采用了toast、AlertDialog、MyDatabaseHelper等技术来进行开发。在本文中,第一章介绍了该app的研究背景,简要阐述了开发使用的java语言和使用java语言开发软件的必要性。第二章则介绍了用户对于这个app的需求以及app预计实现的功能。第三章介绍了该app对于每一模块的底层逻辑设计,为之后的开发打下基础。第四章描述了软件各个页面和模块的代码实现方式。第五章记录了对app进行各项测试后的结果。最后,第六章对整个论文进行了一个总结。关键字:安卓,血压监测与分析目录第1章绪论 61.1研究背景 61.2java语言与androidapp开发 61.2.1java语言 61.2.2androidapp开发 7 第2章个人血压检测与分析app需求与分析 102.1app对象人群 102.2app预计实现功能 102.3个人血压检测与分析app用例规格说明 10第3章个人血压检测与分析app设计 123.1数据结构的设计 123.1.1用户数据 123.1.2服药数据 123.1.3血压数据 133.2登录模块逻辑设计 133.3服药模块逻辑设计 143.4血压模块逻辑设计 143.5个人模块逻辑设计 15第4章个人血压检测与分析app实现与实现 164.1页面布局及切换的实现 164.1.1登录页面 164.1.2注册页面 164.1.3服药计划显示页面 174.1.4添加服药计划页面 184.1.5查看血压页面 184.1.6输入血压页面 194.1.7个人信息页面 204.1.8服药历史记录查看页面 204.1.9页面切换的实现 214.2登录与注册的实现 244.3服药计划编辑及闹铃设置的实现 274.4血压折线及时间段切换的实现 324.5过往服药数据读取的实现 354.6个人血压检测与分析app测试 364.6.1登陆及注册测试 364.6.2服药数据测试 364.6.3血压数据测试 37第5章总结与展望 38参考文献 39第1章绪论1.1研究背景随着时间的不断发展,智能手机已经成为当今人们手中不可或缺的一部分,智能手机的系统主要分为两大类:ios和安卓。其中只有苹果手机使用ios系统,其余大部分手机均使用安卓操作系统。这导致了安卓系统的软件开发占据了移动端软件开发的一大部分。高血压等血压疾病已经成为了一大普遍疾病。它的定义是平均收缩压≥140mmHg,平均舒张压≥90mmHg[1]。我国高血压患病率仍然处于较高水平,高血压的危险因素为男性、高龄、居住在城市、慢性病数量>1种、饮酒、血脂异常和糖尿病[2]。2013年中国有250万人死于高血压,占全部死因的27.5%,伤残调整寿命年的14.28%。2015年中国>18岁人群有2.445亿高血压患者。2017年,中国有254万(95%UI226万~282万)人死于高收缩压,其中95.7%(95.6%~96.4%)死于心血管病[3]。但是许多人对此并不重视。由此可知,我国社会上有相当多一部分人有着对自己血压进行监测记录的需要,一旦发现血压异常或可能异常,那么这些用户就有了服药的前提。有的人因为某些原因如繁忙的日常任务或个人记忆力较差等原因经常忘记服药。这时就需要有一个软件来提醒这些用户该在何时服药并记录这些用户的血压情况以反馈身体状况。本课题致力于基于安卓系统开发一款个人血压监测与分析app,旨在为需要的用户提供可视化的血压变化监测以及及时的服药提醒服务,能让用户直观地了解自己的血压变化。1.2java语言与androidapp开发1.2.1java语言Java编程语言是一种面向对象的计算机软件项目开发语言,是目前计算机领域最受欢迎的计算机编程语言之一。它是一种跨平台语言,具备较高的安全性、平稳性以及具有可移植性。此外,Java编程语言具有较多的开发工具、软件架构模式和软件包。能够让用户在最短的时间内搭建出一个安全可靠的属于自己的应用软件平台。Java语言的有效利用,不仅能让整个开发工作变得简单便捷,且该语言功能强大,能够满足用户对软件功能所提出的绝大部分要求[4]。java语言有着相当大的前景和未来趋势,简要的概括一下可以总结为以下几方面:集成化发展、Java手机市场庞大、Java将开发桌面应用系统、Java多线程机制较大发展空间[5]。java编程语言在安卓等平台的应用上更为普遍,对于安卓类软件开发,需要具备交互性操作,这也是开发软件时具备的重要特征。在实际开发过程中,交互性得到充分的体现,才能推动智能化未来有更好的发展。基于JAVA的推动,编程设计更具针对性,含有的功能也在不断的完善,种类之间可以实现有效的交互,并且包含选择性的特点。另外,java编程语言在软件开发中的应用,可以有效将硬件与软件区分开,建立更加完整的系统,确保电子产品中软件功能的独立性,并且编程技术具有可移植性,可以在不同的电子产品中使用,实现java的交互[6]。在传统的各种编程语言中,其大部分都存在一个显著的缺陷,那就是只能在其使用的一体化计算机中使用,一旦脱离其计算机那么该语言编程就无法运转,这也给系统开发的发展带来了极大的阻碍,因此,JAVA语言就很好的解决了这一问题,JAVA语言的运行与计算机的结构是没有直接关系的,也就是说其语言的编写不只是局限于单个计算机之中,能够在其他各种系统中进行运作,这也是JAVA语言的核心优势之一,相对于其他编程语言而言较为独立,不会因在不同的计算机中而发生变化,在不同的结构计算机中所显示的数据相同,不因计算机系统的差异影响[7]。1.2.2安卓程序开发安卓系统作为一个开源的系统,其有着相当多的语言可以用于开发对应的app如C/C++/java/C#/python/ruby/go/javaScript+html等等。这些语言各有优劣,java/C++/C#/go/C注重运行效率,而其余语言则注重开发效率。这些语言中主流的语言有java、C++和python三种。简单分析一下三种语言,C++重运行效率。但是跨平台性较弱。开发难度较高。库多,用的人多。Python,重开发效率。跨平台性高。开发难度低,库多,用的人多。Java。重开发效率。不及python,重运行效率,不及C++。开发难度低。库多。用的人多。对于开发者来说,python在图形处理方面效率不及另外两门语言,而智能手机app开发都要用到大量的图形界面与处理,加之其没有庞大的社区和库可以使用,这使得他在安卓开发中相对弱势。C++这门语言依赖本地的C++库进行编译,但不同框架中的编译环境不尽相同,这就导致了使用C++的安卓程序在不同的手机上可能会表现出不同的结果,甚至导致出现各种Bug。这就代表着使用C++开发安卓app时调试会更加困难与复杂,需要更多的纠错成本。同时C++程序的工程化也是一件十分麻烦的事情。java则有效地解决了上述问题。虽然java的运行效率不及C++,但手机端对效率的要求并不严格。java还可以通过虚拟机开发来解决不同机器上的环境差异,只要在编写程序后将程序打包成运行码而非机器码即可保持程序在不同环境中按同样的方法运行。java程序的开发效率虽然比不上python等轻语言,但却比c++高上许多。在选择开发语言时,我们有很多的因素需要考虑,其中最主要的是环境考量、平台适应性、程序编写需求、语言编程熟练性和开发成本这些因素[8]。Java语言的优势正在于能够进行图像处理与描述,这两方面的优势让Java语言有了自己的一席之地。在实际编程的过程中,Java语言的好处就在于能够进行详细的交互,从而让用户与软件之间实现深入的互动,未来使用Java语言将能够更好地进行可视化编程[9]。在计算机软件开发中,为了满足用户观看各种图片、视频的需求,可以使用JAVA编程语言进行针对性功能开发。通过JAVA编程语言,可以使软件根据用户的访问需求,调取各类图像、图形。如果没有JAVA编程语言的应用,将无法实现计算机软件的快速调用图像、图形功能,导致人们无法在使用软件时获得清晰、直观的体验,自然也无法实现软件的多样化功能[10]。总结一下,java语言的开发效率介于python与c++之间,运行效率也在两者之间,是二者的一个平衡。同时通用性高,开发性能好,受安卓母公司google的支持。故成为了现在安卓软件开发的最主流语言。个人血压检测与分析app需求分析2.1个人血压检测与分析app对象人群该软件主要面向人群为存在血压疾病的人群或任何需要定时服药提醒的人群。2.2个人血压检测与分析app预计实现功能图2.1用例图根据用例图显示,用户打开软件后根据其是否已有账号决定其是否需要注册账号,若无账号则需要进入注册页面进行注册。注册功能可以允许用户注册属于自己的可以用于该软件的账号,不同账号间的各类数据都是不通用的。注册账户之后用户可以凭借自己的账号登录软件主体。主体共分为三大项,第一项是服药,它允许用户查看自己设置的服药计划,还可以通过右上角的加号来添加新的服药计划。第二项是血压,这里可以显示最近七天或十四天内的血压记录,同样可以通过右上角加号添加新的血压测量数据。第三项为个人,用户可以在这里退出登录或查看过往所有的服药历史记录。2.3个人血压检测与分析app用例规格说明在这里我将对四个用例进行规格说明:登录、注册、添加服药计划和添加血压。登录:所有用户说明用户登录账号前提条件用户已有账号后置条件用户登录成功基本事件流用户打开软件->确认账号密码已输入->验证通过->用户成功登录异常事件流第一异常事件流用户名或密码为空第二异常事件流用户名或密码错误注册:所有用户说明用户注册账号前提条件用户无已有帐号后置条件用户注册成功基本事件流用户进入注册页面->确认账号密码已输入->用户成功注册异常事件流第一异常事件流用户名或密码为空添加服药计划:所有用户说明用户添加服药计划前提条件用户已经登陆后置条件用户成功添加服药计划基本事件流用户进入添加服药计划页面->输入各项数据->选择时间->用户成功添加服药计划异常事件流添加血压:所有用户说明用户添加血压数据前提条件无后置条件用户成功添加血压数据基本事件流用户进入添加血压页面->输入各项数据->选择时间->用户成功添加血压数据异常事件流第一异常事件流血压数据值为空或不是数字第三章个人血压检测与分析app的设计3.1数据结构的设计本app中一共有三种数据,分别为用户数据、服药数据以及血压数据。3.1.1用户数据对于用户数据,在数据库中建立表user,表中数据分为三列。第一列为id,数据类型为integer,第二列为name,数据类型为varchar,长度100字节,第三列为password,类型为varchar,长度100字节。其中id为该表主键。创建过程如图3.1所示。id项为注册新用户名到更新数据库时自动创建,为标识符。name项为用户名,存在唯一性,数据库内无重复用户名。passoword项为密码,每个用户使用其对应的密码进行登录,可以设置任意不为空字符串为密码。图3.1用户数据表3.1.2服药数据对于服药数据,在数据库中建立表alarm,表中数据共有七列。第一列为id,数据类型为integer,第二列为userId,数据类型为varchar,长度100字节,第三列为type,数据类型为varchar,长度100字节,第四列为meds,数据类型为varchar,长度100字节,第五列为amount,数据类型为varchar,长度100字节,第六列为tips,数据类型为varchar,长度100字节,第七列为time,数据类型为varchar,长度100字节。其中id为该表主键。创建过程如图3.2所示。id项为添加服药计划到数据库时自动创建,为标识符。userId为当前登录用户的id,从数据库中读取,用于区分不同用户的服药记录。type为标记用,通过不同数据判断是否是被删除过的数据,被删除过的数据在服药界面不显示,只在服药历史记录中显示。meds为药品名称字符串。amount为该次服药的数量。tips为用户对该次服药自行添加的备注。time为该次服药记录的时间,精度精确到分钟。图3.2服药数据表3.1.3血压数据对于血压数据,在数据库中建立表bloodpressure,表中数据共五项。第一列为id,数据类型为integer。第二列为userId,数据类型为varchar,长度为100字节。第三列为hbp,数据类型为varchar,长度为100字节。第四列为lbp,数据类型为varchar,长度为100字节。第五列为time,数据类型为varchar,长度为100字节。其中id为该表主键。创建过程如图3.3所示。id为录入血压数据到数据库是自动创建的,作为标识符使用。userId为当前登录用户的id,从数据库读取,用以区分不同用户的血压数据。hbp为血压值中的收缩压。lbp为血压值中的舒张压。time为本次血压的测量时间。图3.3血压数据表3.2登录模块逻辑设计登录模块是打开软件后的第一个页面,用户在给定的两个输入框中分别输入账号(et_account)和密码(et_password)。点击登录之后触发按钮的onclick函数,由onclick函数先判断用户名或密码是否为空,不为空则执行Login函数。触发函数后会进入数据库查找对应的账号密码组合是否存在,存在相同账号则提示登陆成功,并进入系统主界面,不成功则返回登陆失败,要求重新输入。3.3服药模块逻辑设计服药模块主要分为两个页面:服药计划展示页面和服药计划添加页面。第一个页面是服药计划展示页面,它可以通过主菜单下侧三个按钮之中左侧服药按钮点击进入,同时它也是登陆之后的默认页面。在页面加载时通过initData()函数调用getData()函数读取数据库中存储的服药记录。获取到数据之后在页面中的recyclerView中进行显示。与此同时每一条服药计划单元都有一个删除按钮用于在触发后隐藏无效计划。第二个页面是服药计划添加页面,它可以由服药计划展示页面点击右上角的加号进入。该页面共有三个输入项,一个文字框,第一个输入框输入药物名称(et_01),第二个输入框输入药物数量(et_02),第三个输入框输入用户自定义的备注(et_03),文字框通过点击激活对应的onclick函数,在onclick函数中调用android.app中的DatePickerDialog和TimePickerDialog打开时间选择界面。选择结束后记在第文字框内(et_04)。四个输入项都完成之后点击添加按钮触发对应的onclick函数,将三个输入项与当前时间组合成一个服药计划单元存入数据库(db.insert),同时根据时间设定好对应的闹钟(am.setExact)。3.4血压模块逻辑设计血压模块共分两个页面:血压展示页面和血压添加页面。第一个页面是血压展示页面,它可以由主页面下侧菜单中间按钮点击进入。进入后页面加载时会执行initData函数,随之调用getData函数从数据库中读取当前用户的血压记录信息。读取到之后调用setData函数来显示当前时间区段的血压记录值,在setData执行的过程中initChartView函数被调用,折线图根据setData中的数据被绘制出来。页面上还有两个按钮,通过这两个按钮的onclick函数,用户可以通过setData的输入切换显示过去七天或过去两周的血压记录。第二个页面是血压添加页面,它可以通过血压页面右上角加号点击进入。在这个页面中,用户需要输入测量出的收缩压(et_num),舒张压(et_num2)。第三个输入框内为血压测量时间(et_time),该时间由DatePickerDialog选择后直接赋值。点击添加按钮触发对应的onclick函数,将三个数据组合成血压数据单元存放至数据库中(db.insert)。3.5个人模块逻辑设计个人模块共两个页面:个人信息页面和服药历史记录页面。第一个页面是个人信息页面,它可以通过主页面下侧菜单右侧按钮进入。该页面可以显示当前登录用户的用户名,同时有两个可点击内容。点击服药记录可以跳转至服药历史记录页面。点击退出登录则执行onclick函数跳转回到登录页面第二个页面是服药历史记录页面,它通过个人信息页面点击服药历史进入。页面加载时调用getData函数获取对应用户过往服药记录。读取后通过setAdapter函数显示到recyclerView当中。第4章个人血压检测与分析app的实现与测试4.1页面布局及切换的实现该app共包含8个页面,分别是登录页面,注册页面,服药计划显示页面,添加服药计划页面,查看血压页面,输入血压页面,个人信息页面,服药历史记录查看页面。4.1.1登录页面该页面为登录用的主界面,进入软件后的第一个页面,顶部有文字提示该页面为登录页面。下方页面有一张背景图片、一句欢迎语、两个包含提示的输入框以及一个登录按钮和指向注册页面的跳转文字。具体实现效果如图4.1所示图4.1登录页面4.1.2注册页面该页面为注册用页面。顶部有文字提示该页面为注册页面,左侧有返回登录页面的叉号,下方为背景图片,一句提示语、两个包含提示的输入框和注册按钮。具体实现效果如图4.2所示图4.2注册页面4.1.3服药计划显示页面该页面为服药计划显示页面,顶部标题提示该页面为服药计划页面,右侧加号点击后可以进入添加服药计划页面。中间为服药计划展示部分,每一条服药计划都会按照格式显示在屏幕上,从上到下依次排列。底部为底部菜单栏,用以切换三个主要页面。具体实现效果如图4.3所示图4.3服药计划展示页面4.1.4添加服药计划页面该页面为添加服药计划页面,顶部标题提示该页面为添加服药计划页面。下侧一共三个输入框一个文字框。文字框分别输入药物名称、药物数量以及备注。文字框通过点选来选择提示时间。最下面为添加按钮,点击后可以添加一个服药计划。图4.4添加服药计划页面4.1.5查看血压页面该页面为查看血压页面,顶部标题提示该页面为查看血压页面。标题右侧加号点击可以进入输入血压页面。中部为主要部分,偏上侧为根据所选时间段绘制的血压值折线。中间为两个按钮,点击以切换血压折线时间段,分别有一周内和两周内两种选项。偏下侧为对应时间段所有血压值的列表,每一条都显示了该次测量血压的收缩压、舒张压和测量时间。最下方为底部菜单栏用以切换三大主要页面。具体实现效果如图4.5所示。图4.5查看血压页面4.1.6输入血压页面该页面为血压输入页面,主要包含三个输入框和一个按钮。输入框分别有着对应的名字和提示。其中时间输入为点击后选择日期。在输入框下面是用于添加的按钮。具体实现效果如图4.6所示。图4.6输入血压页面4.1.7个人信息页面该页面为个人信息页面,主要分为三部分。顶部为简易的头像和状态显示以及用户名显示。中部为服药历史记录页面的入口和退出登录按钮。入口按钮右侧有装饰用箭头指示。下方为主页面包含的底部菜单栏,用于在三大主页面间进行切换。图4.7个人信息页面4.1.8服药历史记录查看页面该页面为服药历史记录查看页面。顶部有文字提醒该页面显示历史服药记录。下侧为该用户对应的历史服药记录。每一条记录都有四个部分,分别是名称、数量、备注和日期。前三项为用户自行输入的数据,最后一项是精准度到分的标准时间格式。图4.8服药历史记录查看页面4.1.9页面切换的实现在这个程序中一共存在两种页面的切换,第一种是同activity不同fragment间的切换,另外一种是不同activity之间的切换。对于第一种而言,它存在于MainActivity中,服药计划显示页面、查看血压页面和个人信息页面都是基于MainActivity的不同fragment。当某一fragment的选项被选中时,触发对应的OnCheckedChangeListener。这时会执行切换样式及fragment的函数。切换时首先建立一个FragmentTransactionft。然后将当前activity赋值给ft。这可以获取到当前正在显示的fragment,将它隐藏。然后通过传入的参数判断我要切换到的目标fragment。找到后要先检查该fragment是否为空即未创建状态,若页面未创建则需将其创建后添加至ft中。然后使用ft.show函数将其显示出来。而对于第二种来说,安卓程序中一般通过点击方式切换页面。我给每一个用于切换页面的按钮都绑定了对应的onclick函数。在这些onclick函数中分别使用intent指定要跳转的目标页面,使用startActivity函数完成页面切换,以查看血压页面到输入血压页面为例。核心代码://初始化监听器.protectedvoidinitListener(){//使用扩展类的初始化函数.super.initListener();//为下侧单选组添加改变监听器.mainRadioGroup.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){@OverridepublicvoidonCheckedChanged(RadioGroupradioGroup,intcheckedId){switch(checkedId){caseR.id.rb_plan:ImmersionBar.with(MainActivity.this).keyboardEnable(false).statusBarDarkFont(true).init();showFragment(0);break;caseR.id.rb_bloodpressure:showFragment(1);ImmersionBar.with(MainActivity.this).keyboardEnable(false).statusBarDarkFont(true,0.2f).navigationBarColor(R.color.btn3).init();break;caseR.id.rb_my:showFragment(2);ImmersionBar.with(MainActivity.this).keyboardEnable(false).statusBarDarkFont(true,0.2f).navigationBarColor(R.color.btn3).init();break;}}});}//显示视图publicvoidshowFragment(inti){FragmentTransactionft=getSupportFragmentManager().beginTransaction();hideFragments(ft);switch(i){case0:if(planFragment!=null)ft.show(planFragment);else{planFragment=newPlanFragment();ft.add(R.id.frameLayout,planFragment);}break;case1:if(bpFragment!=null)ft.show(bpFragment);else{bpFragment=newBloodPressureFragment();ft.add(R.id.frameLayout,bpFragment);}break;case2:if(meFragment!=null)ft.show(meFragment);else{meFragment=newMeFragment();ft.add(R.id.frameLayout,meFragment);}ImmersionBar.with(this).keyboardEnable(false).statusBarDarkFont(false).navigationBarColor(R.color.colorPrimary).init();break;}mit();}//隐藏视图privatevoidhideFragments(FragmentTransactionft2){if(planFragment!=null)ft2.hide(planFragment);if(bpFragment!=null)ft2.hide(bpFragment);if(meFragment!=null)ft2.hide(meFragment);}4.2登录与注册的实现用户在初次登录时或者手动退出登录之后需要进行登录,这时如果用户没有一个账号,就进入了注册流程。注册时用户需要输入一对用户名和密码,用户名可以是任意不超过100字符的字符串,但不能与已有用户名重复。密码则是一个不超过100字符的非空字符串。除此之外没有限制。当用户输入完成口点击注册按钮(btn_register)后会触发它的onclick函数,此时会判断用户名或密码是否存在空串,如果有则会用toast显示对应的提示文字并返回。若满足均为非空串的条件下会执行下一步,记录下用户名和密码,建立SQLiteDatabasedb来去数据库中查找对应用户名,若用户名已经存在则会提示用户名已存在然后返回。否则会将新的用户名密码对存放至数据库中。用户名注册成功后会返回登录界面。在登录界面内,用户需要输入自己已经注册过的用户名及密码。之后点击登录按钮(btn_login)后触发对应的onclick函数,该函数读取页面中的用户名和密码并将其传输给login函数作为输入值。login函数中新建了一个SQLiteDatabasedb,使用传入的用户名和密码对数据库进行检索,找到完全匹配的用户名密码对则成功登录,进入系统主界面。失败则提示用户名或密码错误,请重试。核心代码:注册实现:databaseHelper=newMyDatabaseHelper(this,"user.db",null,1);btn_register.setOnClickListener(newView.OnClickListener(){//为注册按钮绑定点击事件的监听@OverridepublicvoidonClick(Viewview){//两项都为空if(StringUtils.getEditTextData(et_account).isEmpty()&&StringUtils.getEditTextData(etPassword).isEmpty()){ToastUtils.showToast(RegisterActivity.this,"请输入用户名或密码.");return;}//用户名为空if(StringUtils.getEditTextData(et_account).isEmpty()){ToastUtils.showToast(RegisterActivity.this,"请输入用户名.");return;}//密码为空if(StringUtils.getEditTextData(et_password).isEmpty()){ToastUtils.showToast(RegisterActivity.this,"请输入密码.");return;}Stringusername=StringUtils.getEditTextData(et_account);Stringpassword=StringUtils.getEditTextData(et_password);SQLiteDatabasedb=databaseHelper.getWritableDatabase();Cursorcursor=db.rawQuery("select*fromuserwherename=?",newString[]{username});if(cursor.moveToNext()){Toast.makeText(RegisterActivity.this,"该账号已被注册.",Toast.LENGTH_SHORT).show();}else{ContentValuesvalues=newContentValues();//把账号和密码添加到value中.values.put("name",username);values.put("password",password);db.insert("user",null,values);//提示信息.Toast.makeText(RegisterActivity.this,"账号注册成功.",Toast.LENGTH_SHORT).show();finish();}}});登录实现:@OnClick({R.id.btn_login})publicvoidonViewClicked(Viewview){//绑定点击事件.switch(view.getId()){//如果是登录按钮.caseR.id.btn_login:if(StringUtils.getEditTextData(et_account).isEmpty()&&StringUtils.getEditTextData(et_password).isEmpty()){ToastUtils.showToast(this,"请输入账号和密码");return;}if(StringUtils.getEditTextData(et_account).isEmpty()){ToastUtils.showToast(this,"请输入账号");return;}if(StringUtils.getEditTextData(et_password).isEmpty()){ToastUtils.showToast(this,"请输入密码");return;}Stringusername=StringUtils.getEditTextData(et_account);Stringpassword=StringUtils.getEditTextData(et_password);Login(username,password);break;}}privatevoidLogin(Stringusername,Stringpassword){SQLiteDatabasedb=databaseHelper.getReadableDatabase();//在数据库中查找对应账号密码.Cursorcursor=db.rawQuery("select*fromuserwherename=?andpassword=?",newString[]{username,password});if(cursor.moveToNext()){//获取当前行用户id.intuserId=cursor.getInt(cursor.getColumnIndex("id"));Toast.makeText(LoginActivity.this,"登录成功!",Toast.LENGTH_SHORT).show();SPUtils.put(LoginActivity.this,"name",username);SPUtils.put(LoginActivity.this,"userId",userId+"");//切换至主页面Intentintent=newIntent(loginActivity.this,mainActivity.class);startActivity(intent);//删除登陆页面finish();}else{//登陆失败Toast.makeText(LoginActivity.this,"账号或密码错误,请重新输入",Toast.LENGTH_SHORT).show();}}4.3服药计划编辑及闹铃设置的实现服药计划方面,我将每一个服药计划都当作一个闹钟项来处理。对于服药计划,我设置了一个alarmBean,它的属性id,userId,type,content1,content2,content3和time这几项。方法则是每一项属性的getter和setter函数。对于添加服药计划数据来说,在activity_add.xml中,我将添加按钮赋予一个id:btn_add。此时页面中存在4个数据:et_01、et_o3、et_03、et_04。他们分别代表了名称、数量、备注和时间四项。这个xml所对应的java文件为addalarmActivity.java。在java类中,我使用了butterknife框架中的bindView来获取数据和选中按钮。@BindView(R.id.et_01)EditTextet_01;@BindView(R.id.et_02)EditTextet_02;@BindView(R.id.et_03)EditTextet_03;@BindView(R.id.et_04)TextViewet_04;@BindView(R.id.btn_add)Buttonbtn_add;该页面中第四项的et_04为TextView,点击后触发onclick函数。函数中读取当前时间并记录。然后这里我使用了android的DatePickerDialog和timePickerDialog函数,将之前读取到的时间自动导入并修改来获得用户想要的时间组合。最后将分散的时间变量组合成时间字符串返回到et_04当中显示给用户。该页面中的btn_add按钮在点击后会触发onclick函数。触发后由于还在同一个页面,java数据共享,我们可以直接获取到在DatePickerDialog和timePickerDialog函数中组合得到的时间,将其转换成date类型再通过getTime方法转换为闹钟需要的long型整数。最后通过alarmManager的am.setExact方法来设置一个精准闹钟。设置好了闹钟之后要将该数据添加到数据库存储起来,通过之前的处理我们可以得到时间字符串和之前获取的et_01-et_03。id通过Sputils获取一个id,type值为默认的0。这样就获得了一个标准的数据单元。此时创建一个SQLiteDatabase类型的数据来获取数据库db,再用db.insert将该数据插入数据库中。核心代码:publicvoidonClick(Viewv){switch(v.getId()){caseR.id.et_04:calendar.setTimeInMillis(System.currentTimeMillis());finalinttyear=calendar.get(Calendar.YEAR);finalinttmonth=calendar.get(Calendar.MONTH);finalinttday=calendar.get(Calendar.DAY_OF_MONTH);finalinttmhour=calendar.get(Calendar.HOUR_OF_DAY);finalintmminute=calendar.get(Calendar.MINUTE);newDatePickerDialog(AddAlarmActivity.this,newDatePickerDialog.OnDateSetListener(){@OverridepublicvoidonDateSet(DatePickerdatePicker,finalintyear,finalintmonth,finalintday){newTimePickerDialog(AddAlarmActivity.this,newTimePickerDialog.OnTimeSetListener(){@OverridepublicvoidonTimeSet(TimePickerview,intthourOfDay,inttminute){calendar.set(Calendar.YEAR,year);calendar.set(Calendar.DAY_OF_MONTH,day);calendar.set(Calendar.MINUTE,tminute);calendar.set(Calendar.MONTH,month);calendar.set(Calendar.MILLISECOND,0);calendar.set(Calendar.HOUR_OF_DAY,thourOfDay);calendar.set(Calendar.SECOND,0);yearformat=format(tyear);monthformat=format(month+1);dayformat=format(day);hourformat=format(hourOfDay);minuteformat=format(minute);Strings=yearformat+"-"+monthformat+"-"+dayformat+""+hourformat+":"+minuteformat;s3=yearformat+"-"+monthformat+"-"+dayformat+""+hourformat+":"+minuteformat+":"+"00";et_04.setText(s);}},mhour,mminute,true).show();}},tyear,tmonth,tday).show();break;caseR.id.btn_add:SimpleDateFormatsimpleDateFormat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");try{Datedate=simpleDateFormat.parse(s3);longts=date.getTime();Randomr=newRandom();Intentintent=newIntent(AddAlarmActivity.this,CallAlarm.class);intent.putExtra("meds",et_01.getText().toString().trim());PendingIntentsender=PendingIntent.getBroadcast(AddAlarmActivity.this,r.nextInt(),intent,PendingIntent.FLAG_UPDATE_CURRENT);AlarmManageramanager;amanager=(AlarmManager)getSystemService(ALARM_SERVICE);if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){amanager.setExact(AlarmManager.RTC_WAKEUP,ts,sender);}}catch(Exceptione){e.printStackTrace();}Stringtrim=et_01.getText().toString().trim();Stringtrim_3=et_03.getText().toString().trim();Stringtrim_2=et_02.getText().toString().trim();SQLiteDatabasedb=databaseHelper.getReadableDatabase();ContentValuesvalues=newContentValues();values.put("userId",(String)SPUtils.get(AddAlarmActivity.this,"userId",""));values.put("tips",trim_3);values.put("meds",trim);values.put("type","0");values.put("amount",trim_2);values.put("time",s3);db.insert("alarm",null,values);Toast.makeText(AddAlarmActivity.this,"计划添加成功!",Toast.LENGTH_SHORT).show();Intentintent=newIntent();intent.setAction("freshHome");sendBroadcast(intent);finish();break;}}对于查看当前服药计划来说,使用的页面为fragment_plan.xml文件。其对应了两个java文件:mainActivity和PlanFragment。其中mainActivity主要提供页面切换功能,此处不做详细介绍。查看服药计划主要代码均位于PlanFragment.java文件中。首先是页面创建时时由extends出的baseActivity调用的initData函数,该函数会调用getData函数从数据库中读取所有属于当前用户且未被标记成删除记录(type=0)的服药计划。此时我取得了一个cursor游标,每次游标移动后我都新创建一个alarmbean,并从cursor中读取各项数据再放入alarmbean中。当我完成一个alarmbean之后将其加入事先创建好的数组list中。全部数据读取之后通过adapter中的alarmadapter获取list_item_plan中预设的单元样式。最后用setAdapter将整个列表中的数据单元放入fragment_plan页面中的RecyclerView标签中。核心代码:privatevoidgetData(){SQLiteDatabasedb=databaseHelper.getReadableDatabase();lists.clear();Cursorcursor=db.rawQuery("select*fromalarmwhereuserId=?andtype=?",newString[]{(String)SPUtils.get(getActivity(),"userId",""),"0"});while(cursor.moveToNext()){AlarmBeanalarmBean=newAlarmBean();intid=cursor.getInt(cursor.getColumnIndex("id"));StringuserId_1=cursor.getString(cursor.getColumnIndex("userId"));Stringtype_1=cursor.getString(cursor.getColumnIndex("type"));Stringmeds=cursor.getString(cursor.getColumnIndex("meds"));Stringamount=cursor.getString(cursor.getColumnIndex("amount"));Stringtips=cursor.getString(cursor.getColumnIndex("tips"));Stringtime=cursor.getString(cursor.getColumnIndex("time"));alarmBean.setId(id);alarmBean.setUserId(userId_1);alarmBean.setMeds(meds);alarmBean.setAmount(amount);alarmBean.setTips(tips);alarmBean.setTime(time);alarmBean.setType(type_1);lists.add(alarmBean);}adapter=newAlarmAdapter(getActivity(),R.layout.list_item_plan,lists);recyclerView.setAdapter(adapter);}4.4血压折线及时间段切换的实现血压数据在录入时与去除了闹铃功能的服药计划数据的录入过程几乎完全一致,在此不做过多解释。当获得了血压数据后,在血压界面创建时会根据时间段读取血压数据来绘制图表和输出,默认时间段为包括当天在内的最近七天。在初始创建或点击按钮更新时调用setData函数,通过输入不同数字来更改时间段。在setData中,我使用了Calendar.getInstance来获取当前时间,根据输入时间段用Calendar.add来调整日期。使用Calendar.getTime将时间导入到一个date对象中。此时执行dateToWeek函数,通过循环将整个日期列表处理完成后返回一个list。该list里包含了整个时间段的日期,获取到日期之后进行循环,对每一个日期在数据库中寻找userId和日期都匹配的数据,找不到则置零。全部完成后调用initChartView函数完成对折线图的渲染,使用adapter获取预先设置好的血压单元格式进行渲染并放入fragment_bloodpressure.xml页面中的RecyclerView中显示。核心代码:privatevoidsetData(intprogress){listString.clear();SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd");Calendarc=Calendar.getInstance();c.add(Calendar.DATE,progress*-1);Dated=c.getTime();List<Date>days=dateToWeek(d,progress);for(Datedate:days){listString.add(format.format(date));}for(inti=0;i<listString.size();i++){SQLiteDatabasedb=databaseHelper.getReadableDatabase();Cursorcursor=db.rawQuery("select*frombloodpressurewhereuserId=?andtime=?",newString[]{(String)SPUtils.get(getActivity(),"userId",""),listString.get(i)});if(cursor.moveToNext()){BloodPressureBeanbloodpressureBean=newBloodPressureBean();intid=cursor.getInt(cursor.getColumnIndex("id"));StringuserId1=cursor.getString(cursor.getColumnIndex("userId"));Stringhbp=cursor.getString(cursor.getColumnIndex("hbp"));Stringlbp=cursor.getString(cursor.getColumnIndex("lbp"));Stringtime=cursor.getString(cursor.getColumnIndex("time"));bloodpressureBean.setId(id);bloodpressureBean.setUserId(userId1);bloodpressureBean.setTime(time);bloodpressureBean.setHbp(hbp);bloodpressureBean.setLbp(lbp);lists.add(bloodpressureBean);}else{BloodPressureBeanbloodpressureBean=newBloodPressureBean();bloodpressureBean.setUserId((String)SPUtils.get(getActivity(),"userId",""));bloodpressureBean.setTime(listString.get(i));bloodpressureBean.setHbp("0");bloodpressureBean.setLbp("0");lists.add(bloodpressureBean);}}initChartView(lists);adapter=newBloodPressureAdapter(getActivity(),R.layout.list_item_bloodpressure,lists);recyclerView.setAdapter(adapter);}publicstaticList<Date>dateToWeek(Datemdate,intprogress){Datefdate;List<Date>list=newArrayList<Date>();LongfTime=mdate.getTime();for(inta=1;a<=progress;a++){fdate=newDate();fdate.setTime(fTime+(a*24*3600000));list.add(a-1,fdate);}returnlist;}4.5过往服药数据读取的实现用户在服药历史记录页面可以看到过往服药数据。在该activity开始渲染时调用getData函数。从数据库中查找与当前userId相同且已经触发过的所有服药计划。将他们放入alarmbean中存进lists。当所有数据被处理完成后使用adapter对每一条进行渲染,再将其放入activity_history.xml中的RecyclerView中显示。核心代码:privatevoidgetData(){StringuserId=(String)SPUtils.get(this,"userId","");db=databaseHelper.getReadableDatabase();Cursorcursor=db.rawQuery("select*fromalarmwhereuserId=?",newString[]{userId});while(cursor.moveToNext()){AlarmBeanalarmBean=newAlarmBean();intid=cursor.getInt(cursor.getColumnIndex("id"));Stringuser

温馨提示

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

评论

0/150

提交评论