移动数据库应用开发大作业
题目: 基于Android平台的理财通软件开发
学 院: 信息工程学院
专 业: 网络工程
班 号:
学生姓名:
指导教师:
基于 android 平台的理财通软件开发
学生姓名:饶明昌班级:170461
指导老师:邬志红
摘要:当今我们生活在一个数字信息化的时代,随着 GPRS、GSM、CDMA、蓝牙、 RFID、WLAN、WIFI、3G 和 4G 等无线技术的飞速发展,以及云端技术的不断成熟,大数据时代已经到来,智能手机已经发展了十多个年头。当今主流品牌手机的操作系统有 Android(安卓)、iOS(苹果)、Windows Phone(微软)、Symbian(塞班)、BlackBerry OS(黑莓),而Android系统凭借其自由及开源性代码迅速在全球占有绝大多数的市场份额。
伴随着科技的不断创新,传统行业也试图通过转型以顺应时代的发展。近些年国家经济发展很快,人民的消费水平也越来越高,但是在现代社会中,很多人对于自己的消费没有严格的控制,特别是如今的商品种类越来越丰富,广告打得也越来越多样化,而且今下年轻人的自制力明显不足,月光族随处可见,甚至消费经常超过自己的经济能力,这样会产生严重影响到正常生活轨迹的后果。而开发一款记账APP则能解决这一问题,让用户对自己的消费有所记录。该APP具备手动记账的基本功能,并能通过数据库管理相关数据。设计最终实现了用户登录功能模块、新增收入功能模块、收入明细功能模块、新增支出功能模块、支出明细功能模块、数据分析功能模块等。通过测试,该系统能够正常运行,各个界面交互性良好。在系统规划时采用了系统功能结构图,并分析了系统所需的各种数据表,详细地展示了系统的各个功能模块,并给出了主要功能的运行效果图。
目录
第一章 绪 论1.1 研究的背景及意义1.2 研究的内容及方法第二章 设计原理和相关技术2.1 构架概述·2.2 关键技术简介·2.3 开发工具配置·2.4 应用平台·第三章 系统需求分析3.1 系统功能分析3.2 可行性分析·3.3 总体设计原则第四章 系统概要设计4.1 系统总体框架设计4.1.1 系统物理架构4.1.2 系统功能模块的设计4.2 数据库设计4.2.1 数据库结构设计4.2.2 数据库表设计4.2.3 数据库的创建与实现第五章 系统详细设计与实现5.1 客户端功能设计5.1.1 欢迎界面5.1.2用户登录模块5.1.3 用户注册模块5.1.4 新增收入模块5.1.5 收入明细模块5.1.6 新增支出模块5.1.7 支出明细模块5.1.8 数据分析模块5.1.9 系统设置模块5.1.10 修改和删除模块第六章 系统的测试及调试第七章 结论
1 绪 论
1.1 研究的背景及意义
近些年国家经济发展很快,人民的消费水平也越来越高,但是在现代社会中,很多人对于自己的消费没有严格的控制,特别是如今的商品种类越来越丰富,广告打得也越来越多样化,而且今下年轻人的自制力明显不足,月光族随处可见,甚至消费经常超过自己的经济能力,这样会产生严重影响到正常生活轨迹的后果。
那么我们是否可以提供一个解决方案,比如说开发一款理财app,让用户可以记录自己的收入与支出情况,并且对自己的收入与支出情况进行分析,这便是我开发这个app的初衷。因此,这个app的开发对于解决上述问题有着很大的现实意义。
1.2 研究的内容和方法
本论文介绍了基于Android平台的理财通软件的整个开发过程。论文详尽论述了从需求分析、概要分析、系统详细设计与实现以及系统调试与测试的整个设计思路。首先全面地研究了理财通软件开发的背景和意义,剖析了市场上主流软件的运行模式,从而得出设计本软件的思路和方法。接着介绍了软件开发的Android平台环境,利用Android内置的SQLite数据库进行数据管理。本软件以Android为平台采用Java语言进行编程,通过一些前端控件实现信息的输入和验证。在系统规划中需要用数据流程图、实体属性图分析数据间的各种关系,全面展示了本设计所要实现的功能模块并给出了各个功能的运行界面图。
理财通APP设计模式主要采用“模型-视图-控制器”MVC架构。利用AndroidStudio的开发环境(IDE)编写JAVA源代码以实现各模块的功能。
系统概要设计分为客户端操作设计和数据库设计两部分。详细设计主要阐述了用户管理,收入管理,支出管理等功能的实现,并列出了系统的核心功能代码。最后对各个功能模块进行了测试,测试结果表明:系统基本具备了完善的功能,视觉上简洁流畅,并且各个功能界面具有良好的交互性。
2 设计原理和相关技术
2.1 构架概述
本软件主要实现的是对支出和收入进行记录、管理、分析,设计最终实现了用户的注册,登录,权限验证,信息记录、信息修改,数据分析等功能。经过测试软件能够正常的运行,各个界面的交互逻辑与体验良好。在整个的设计中运用RecylerView对收入和支出信息展示进行设计,数据分析采用GitHub上的MPAndroidChart开源图表库,并通过SQLite对数据库进行操作。
理财通软件主要采用“模型-视图-控制器”MVC架构的设计模式。MVC架构英文全称是“Model-View-Controller”,MVC 应用程序总是由这三个部分组成。Model 是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数 据库中存取数据。View 是应用程序中处理数据显示的部分,通常视图是依据模型数 据创建的。Controller 是应用程序中处理用户交互的部分,通常控制器负责从视图读 取数据,控制用户输入,并向模型发送数据。其组件类型关系和功能如图 2.1 所示:
图2.1 MVVM组件类型关系和功能图
2.2 关键技术简介
RecyclerView控件
RecyclerView是Android5.0发布的时候推出的一个全新控件,可以支持API 7以上的版本。展示的效果类似于ListView,是列表形式。RecyclerView提供了一种插拔式的体验,高度解耦、灵活和高效。使用LayoutManger、ItemDecoration、ItemAnimator可以实现很多复杂的效果。
SQLite数据库
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,SQLite的主要优势在于灵巧、快速和可靠性高。Android Studio内置了这一数据库供开发者使用。
MPAndroidChart开源图表库
MpAndroidChart是一个开源图表库,它能实现多种常见的图表类型,如:折线图,饼图,堆叠图等。此外它还提供了一些对图表的操作功能,如:拖拽,缩放,显示标签等。这个第三方库能满足一般性图表开发需求。
2.3 开发工具配置
Android Studio
Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。
2.4 应用平台
Android 平台
Android 平台的特点:以 Linux 为核心且为开源性代码。Android 的系统架构采用 分层的架构。android 分为四个层,分别是应用程序层、应用程序框架层、系统运行 库层和 Linux 核心层。对普通的一个 Android 应用程序来讲,一般都是由 Activity、 Intent Receiver、Service、Content Provider 四个部分组成的。另外,Android 应用程 序还需要一个清单文件,叫做 AndroidManifest.xml 文件,在这个文件中对该应用程 序所要用到的每一个活动进行申明,并且定义组件的功能和 intent-filter 等。
Android 解析意图的方法:主要是通过查找在清单文件中已经过注册的相关组件 的 ID 及过滤器(intent filter)找到当中所合适的组件,然后该应用这些组件达到组件 之间的相关匹配。在 Android 框架应用处理 Intent 方法 的过程中,主要通过该 Intent 的三个属性,即动作,数据类型及类别来进行解释。其中顺序次要,先辨别动作的相关匹配程度,如果不匹配的话那么就进行数据类型之间的的解析,如果数据类型仍然不是很匹配的话,则进行相适应的数据格式之间的解析。
Android 的系统架构如图 2.2 所示:
图 2.2Android 系统架构图
3 系统需求分析
3.1 系统功能分析
理财通软件的开发目标客户是一般用户,用户通过Android手机在应用商店下载apk应用程序,安装好后可以注册使用本软件。经分析,该软件完成的功能主要有手机应用客户端程序。该系统在功能和使用性方面应达到如下要求:
(1) 操作简便,页面交互逻辑清晰,交互性良好。界面保持一致性,操作控制等要有反馈,界面保持效率,流程简化,表意清晰明确。
(2) 即时可见:用户对数据的更改能立即在视图中显示出来。
(3) 系统运行应满足快速、高效和稳定,要求页面最大响应时间不可以超过 10s。
(4) 在结构上应具备良好的可扩展性,便于今后功能的扩展和维护。
3.2 可行性分析
此次设计是基于 Android 平台开发的理财通软件。Android 平台为开发者 提供了巨大的开发空间,再运用 JAVA 面向对象语言能够使该系统的功能更加强大。 利用其内置的SQLite数据库建立本系统所需的各种表可以让其数据更加安全可靠。可行性分析也称为可行性研究,主要用于在系统未进行开发之前,对应用开发使用的可行性,系统要实现的功能以及系统如何实现这些功能,系统开发所使用到的技术,系统开发使用到的结构以及系统开发过程中的花费等进行调研,并得到可行性研究报告。得到这一报告后,便可以对系统进行针对性的研究,得到系统的可行性分析。
3.3 总体设计原则
1、开放性、可扩充性、可靠性原则
一款软件投入市场后要想拥有很高的市场占有率,必须满足开放性。能够支持公共的标准,易于扩展升级,兼容性较强。从而适应广大用户需求的多变性和产品的更新换代。
2、良好的用户操作界面
用户操作界面美观、方便、实用,使用户能在较短的时间内掌握其使用方法。 3、实用性原则
实用性需要从开发者和使用者的角度去考虑。一方面,系统越规范,标准化程度 越高,开发者的工作效率也会越高。另一方面,使用者不需要花费太多的学习成本,这样有利于产品的推广和使用。
4、工作平台设计原则
要求系统兼容性好,确保在不同的平台上都能正常工作,而且在各种网络都能够正常运行。
4 系统概要设计
系统的概要设计主要是概述系统的总体功能如何设计,如何按不同功能来划分模块以及系统所用的数据库如何设计等进行研究。本章节为系统的详细设计埋下伏笔。在系统的设计过程中扮演着非常重要的角色
4.1 系统总体框架设计
本方案主要Android客户端,SQLite数据库.终端设备能实现用户的注册,登录,权限验证,信息记录、信息修改,数据分析等功能。
4.1.1 技术选型
在本设计中,Android 客户端选用 Java 技术,数据的存储采用 SQLite 数据库。
4.1.2系统功能模块设计
在系统功能分析中已简单描述了本系统所具有的主要功能,为了更加直观地了解 本系统的各功能模块及它们之间的逻辑关系,采用系统功能结构图的形式展开,整个结构关系如图 4.1 所示:
图4.1 系统功能结构图
由系统功能结构图可知,系统客户端主要由以下几个模块构成:用户注册和登录、添加新增收入、添加新增支出、对收入和支出进行管理、对数据进行分析等。各模块逻辑关系及功能介绍如下:
1.用户登录:为了增强APP的使用安全,使用APP之前需要进行用户登录验证,而登录过程会在后台的数据库通过用户名称和密码进行查询。所以只有注册用户才有权限使用该系统;
2.主页面信息:系统登录成功后便进入了主页面界面,该页面六个Button控件显示六个子功能模块,六个textView控件显示每一个子功能的名称,便于用户选择要进行的操作。
3.新增收入:单击新增收入按钮后可进入页面添加收入信息,在此页面可以记录自己的收入详情,为日后的收入分析做准备。
4.收入明细:当添加完新增收入信息后,可以返回主页面选择点击收入明细按钮,点击按钮后,系统跳转到收入明细界面,在这里可以查看所有记录的新增收入信息,让自己的收入信息一目了然。
5.新增支出:和新增收入类似,单击新增支出按钮后可进入页面添加支出信息,在此页面可以记录自己的支出详情,为日后的支出分析做准备。
6.支出明细: 和收入明细类似,单击支出明细按钮后可进入页面查看所有记录的新增支出信息,让自己的支出信息一目了然。
7.数据分析:添加了很多收入和支出信息,怎样才能让自己对自己的收支有一个更全面的了解了,图表化是一个很好的选择。在这里用户可以看到根据类别显示的金额数据,并且是用折线的形式现实的。
8.系统设置:点击系统设置按钮,可以修改当前用户密码,也可以获取到当前用户的用户名,如果觉得自己的密码设置的不安全可以使用此功能。
4.2 数据库设计
4.2.1 数据库结构设计
数据库的支持是理财通APP能够实现信息管理的重要前提,其结构设计是系统总体设计阶段非常重要的一个环节。数据库设计要按用户具体要求,在 DBMS 中设计其结构和创建数据库。好的的数据库一般有完整的信息和紧凑的结构。此外,数据调用会很便捷,代码编写也较清晰。
4.2.2 数据库表设计
通过需求分析和E-R图分析,使用SQLite创建了名为financial.db的数据库,总共包含以下三张表,分别是用户信息表(tb_userinfo),收入表(in_come),支出表(pay_out)。financial.db数据库中各数据表的具体结构如图4.2所示:
图 4.2 数据表结构
1.用户信息表(tb_userinfo)
用户信息表用以保存用户的注册信息,主要包含编号(id),姓名(name),密码(pwd),邮箱地址(Email),电话号码(phone)。tb_userinfo表的结构如表4.1所示:
表 4.1 tb_userinfo 表结构
序号 | 字段名称 | 字段含义 | 数据类型 | 长度 | 备注 |
---|---|---|---|---|---|
1 | id | 编号 | int | 11 | 主键 |
2 | name | 姓名 | varchar | 10 | |
3 | pwd | 密码 | varchar | 15 | |
4 | 邮箱地址 | varchar | 50 | ||
5 | phone | 电话号码 | varchar | 11 |
用户信息表中保存了所有注册用户的信息,其信息存储状态如图4.3所示:
图4.3用户信息表
2.收入表
收入表用以保存用户输入的收入明细信息,主要包含编号(id),收入金额(inmoney),收入时间(intime),收入类型(intype),付款方(inpayer),备注信息(inremark)。in_come表的结构如表4.2所示:
表 4.2 in_come 表结构
序号 | 字段名称 | 字段含义 | 数据类型 | 长度 | 备注 |
---|---|---|---|---|---|
1 | id | 编号 | int | 0 | 主键 |
2 | inmoney | 收入金额 | double | 0 | |
3 | intime | 收入时间 | varchar | 20 | |
4 | intype | 收入类型 | varchar | 30 | |
5 | inpayer | 付款方 | varchar | 100 | |
6 | inremark | 备注信息 | varchar | 500 |
收入表中保存了用户输入的所有收入信息,其信息存储状态如图4.4所示:
图 4.4收入信息表
3.支出表(pay_out)
支出表用以保存用户输入的支出明细信息,主要包含编号(id),支出金额(outmoney),支出时间(outtime),支出类型(outtype),收款方(outpayee),备注信息(outremark)。pay_out表的结构如表4.3所示:
表 4.3 in_come 表结构
序号 | 字段名称 | 字段含义 | 数据类型 | 长度 | 备注 |
---|---|---|---|---|---|
1 | id | 编号 | int | 0 | 主键 |
2 | outmoney | 支出金额 | double | 0 | |
3 | outtime | 支出时间 | varchar | 20 | |
4 | outtype | 支出类型 | varchar | 30 | |
5 | outpayee | 收款方 | varchar | 100 | |
6 | outremark | 备注信息 | varchar | 500 |
支出表中保存了用户输入的所有支出信息,其信息存储状态如图4.5所示:
图 4.5支出信息表
4.2.3 数据库的创建与实现
本软件所使用的编程语言是java语言,采用AndroidStudio内置的SQLite数据库存储信息。
public class MyDBHelper extends SQLiteOpenHelper {
private static final String DBNAME="financial.db";
private static final int VERSION=1;
public MyDBHelper(Context context) {
super(context, DBNAME, null, VERSION);
}
//1 创建数据库
@Override
public void onCreate(SQLiteDatabase db) {
//创建用户表
db.execSQL("create table tb_userinfo(id integer primary key autoincrement,name varchar(10),pwd varchar(15),email varchar(50),phone varchar(11))");
//创建收入表
db.execSQL("create table in_come(id integer primary key autoincrement,inmoney double,intime varchar(20),intype varchar(30),inpayer varchar(100),inremark varchar(500))");
//创建支出表
db.execSQL("create table pay_out(id integer primary key autoincrement,outmoney double,outtime varchar(20),outtype varchar(30),outpayee varchar(100),outremark varchar(500))");
}
//2 升级数据库
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
5 系统详细设计和实现
本系统的详细设计主要基于Android4.0开发平台,对需要完成系统概要设计中所有功能进行详细设计,所以是整个设计中最关键的一个环节。下面将全面对系统各个功能的实现进行分析。
5.1 客户端功能设计
APP界面主要包含欢迎,用户注册,登录,权限验证,信息记录、信息修改,数据分析等模块。经统计大致有12个运行界面,每个功能模块为用户提供相应的功能,通过vue-router的路由机制实现各个模块的跳转,界面效果整体统一,以简介为主,布局合理,符合操作逻辑,不需要太多的学习成本。
5.1.1 欢迎模块
欢迎界面主要是给用户一个好的第一印象,让用户点开app能得到美的享受,同时欢迎界面也能起到宣传的作用。欢迎运行界面如图5.1所示
图5.1 欢迎运行界面
5.1.2 用户登录模块
考虑到安全性的问题,本程序采用的是用户名和密码验证机制,运行后,进入登录页面后,需要进行登录验证,若此时用户名或密码为空,点击登录会提示“登录名是不能”;若所填的用户名不存在,或用户名正确而密码错误,都会提示“用户名或者密码错误,请重新输入”。当用户名和密码都填写正确时,系统将 成功登录理财通系统首页。流程如图5.2所示:
图 5.2登录流程图
要实现 Android 客户端的登录功能,需要以下几个步骤:
1.创建一个 Android 工程,命名为“RMCFinacial”。
2.在工程 res\layout 目录下创建一个名为“activity_login.xml”的布局文件,最外层使用 LinearLayout 布局。然后在内层嵌套 LinearLayout horizontal布局界面布局。该布局文件中引用了一张图像来显示背景图片,两个 EditText 用来输入用户名称和密码以及一个 Button 用来登录系统。
3.再创建一个名为“LoginActivity”的 Activity,在类里面声明用到的 EditText和Button 组件,然后在 onCreat()方法中调用 setContentView(R.layout.activity_login)方法 设置布局视图,并通过 findViewById()方法实例化 EditText 和 Button 对象。
4.为了便于用户清楚当前操作,还需要定义一个显示提示信息的Toast方法。 5.为了对用户名称和密码进行非空验证,需要定义 btnLogin()方法。
6.为登录按钮添加单击监听器,在 onClick 方法中,若登录成功,系统就会进入首页界面, 否则提示登录失败,若验证失败则会提示失败信息,请求用户和重新输入。
部分功能实现的核心代码如下:
public class LoginActivity extends AppCompatActivity {
//1 定义对象
EditText et_name, et_pwd;
Button btn_newregister, btn_login;
MyDBHelper mhelper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//2 绑定控件
initView();
//3 登录按钮功能的实现
btnLogin();
//4 新用户注册按钮功能的实现
btnNewRegister();
}
//2 绑定控件--------------------代码
private void initView() {
et_name = findViewById(R.id.et_name_lg);
et_pwd = findViewById(R.id.et_pwd_lg);
btn_newregister = findViewById(R.id.bt_newregister_lg);
btn_login = findViewById(R.id.bt_login_lg);
mhelper = new MyDBHelper(LoginActivity.this);
db = mhelper.getWritableDatabase();
}
//3 登录按钮功能的实现---------------------------代码
private void btnLogin() {
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//首先:获取输入的用户名和密码
String inputname = et_name.getText().toString();
String inputpwd = et_pwd.getText().toString();
//其次:对获取的用户名和密码进行判断
if (inputname.equals("") || inputpwd.equals("")) {//用户名或密码为空
Toast.makeText(LoginActivity.this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
} else {//用户名或密码不为空时,我们再对输入的正确性进行判断。
// 根据输入的用户名和密码从数据库中查询
Cursor cursor = db.rawQuery("select * from tb_userinfo where name=? and pwd=?", new String[]{inputname, inputpwd});
//根据查询到的结果进行判断
if (cursor.moveToNext()) {//查询到时
String getname = cursor.getString(cursor.getColumnIndex("name"));
String getpwd = cursor.getString(cursor.getColumnIndex("pwd"));
if (inputname.equalsIgnoreCase(getname) && inputpwd.equalsIgnoreCase(getpwd)) {
SharedPreferences.Editor editor = getSharedPreferences("userinfo", 0).edit();
editor.putString("username", inputname);
editor.putString("userpwd", inputpwd);
editor.commit();
Toast.makeText(LoginActivity.this, "用户名和密码正确,欢迎登陆", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
} else {//没有查询到结果时
Toast.makeText(LoginActivity.this, "用户名或密码错误,请重新输入", Toast.LENGTH_SHORT).show();
et_name.setText("");
et_pwd.setText("");
}
}
}
});
}
//4 新用户注册按钮功能的实现------------------------代码
private void btnNewRegister() {
btn_newregister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
finish();
}
});
}
}
用户登录程序运行结果如图5.3,5.4所示
图 5.3登入未输入用户名和密码 图 5.4登入成功
5.1.3 用户注册模块
用户的注册功能的实现,首先创建一个注册页面RegisterActivity,注册时要求输入用户名,密码,邮箱,电话号码。
部分核心代码如下:
public class RegisterActivity extends AppCompatActivity {
//3定义对象
EditText et_name,et_pwd,et_email,et_phone;
Button btn_register,btn_cancel;
MyDBHelper mhelper;//创建一个数据库类文件
SQLiteDatabase db;//创建一个可以操作的数据库对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
//4 绑定控件
initView();
//5 注册按钮功能的实现
btnRegister();
//6 取消按钮功能的实现
btnCancel();
}
//4 绑定控件--------代码
private void initView() {
et_name=findViewById(R.id.et_name_rg);
et_pwd=findViewById(R.id.et_pwd_rg);
et_email=findViewById(R.id.et_email_rg);
et_phone=findViewById(R.id.et_phone_rg);
btn_register=findViewById(R.id.bt_ok_rg);
btn_cancel=findViewById(R.id.bt_cancel_rg);
mhelper=new MyDBHelper(RegisterActivity.this);
db=mhelper.getWritableDatabase();
}
//5 注册按钮功能的实现--------------------代码
private void btnRegister() {
btn_register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建一个对象,用来封装一行数据
ContentValues values=new ContentValues();
values.put("name",et_name.getText().toString());//将输入的用户名放到name列
values.put("pwd",et_pwd.getText().toString());//将输入的密码放到pwd列
values.put("email",et_email.getText().toString());//将输入的邮箱放到email列
values.put("phone",et_phone.getText().toString());//将输入的电话放到phone列
//将封装好的一行数据保存到数据库的tb_userinfo表中
db.insert("tb_userinfo",null,values);
Toast.makeText(RegisterActivity.this,"注册成功",Toast.LENGTH_SHORT).show();
Intent intent=new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
});
}
//6 取消按钮功能的实现-------------------代码
private void btnCancel() {
btn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
});
}
}
注册界面如图5.5所示
图5.5 注册界面
5.1.4 新增收入模块
新增收入模块功能的实现,首先创建一个NewInComeActivity页面,将用户输入的内容保存到数据库的收入表中。
部分核心代码:
public class NewInComeActivity extends AppCompatActivity {
//1 定义对象
EditText et_money,et_time,et_payer,et_remark;
Spinner sp_type;
Button bt_sava,bt_cancel;
MyDBHelper mhelper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_in_come);
//2 绑定控件
initView();
//3保存按钮功能的实现
btnSave();
//4 取消按钮功能的实现
btnCancel();
}
//2 绑定控件-------------------代码
private void initView() {
et_money=findViewById(R.id.et_money_newin);
et_time=findViewById(R.id.et_time_newin);
sp_type=findViewById(R.id.sp_type_newin);
et_payer=findViewById(R.id.et_payer_newin);
et_remark=findViewById(R.id.et_remark_newin);
bt_sava=findViewById(R.id.bt_save_newin);
bt_cancel=findViewById(R.id.bt_cancel_newin);
mhelper=new MyDBHelper(NewInComeActivity.this);
db=mhelper.getWritableDatabase();
}
//3保存按钮功能的实现--------代码
private void btnSave() {
bt_sava.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取输入的内容保存到数据库的收入表中
ContentValues values=new ContentValues();
values.put("inmoney",et_money.getText().toString());
values.put("intime",et_time.getText().toString());
values.put("intype",sp_type.getSelectedItem().toString());
values.put("inpayer",et_payer.getText().toString());
values.put("inremark",et_remark.getText().toString());
db.insert("in_come",null,values);
Toast.makeText(NewInComeActivity.this,"保存成功",Toast.LENGTH_SHORT).show();
//刷新本页面
Intent intent=new Intent(NewInComeActivity.this,NewInComeActivity.class);
startActivity(intent);
finish();
}
});
}
//4 取消按钮功能的实现--------代码
private void btnCancel() {
bt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(NewInComeActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
});
}
}
注册界面如图5.6所示
图 5.6 新增收入页面
5.1.5 收入明细模块
收入明细页面主要是将用户之前输入的信息显示到一个RecyclerView布局中,所以需要准备数据,设计子布局,定义适配器,并且将适配器和布局管理器加载到控件中。
部分核心代码:
public class InComeDetailActivity extends AppCompatActivity {
//1 定义对象
RecyclerView recy_view;
MyDBHelper mhelper;
SQLiteDatabase db;
List<IncomeBean> arr1=new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_in_come_detail);
//2 绑定控件
initView();
//3 准备数据
initData();
//4 设计每一行的子布局
//5定义适配器: 数据和子布局关联起来(桥梁的作用)
IncomeAdapter adapter=new IncomeAdapter(InComeDetailActivity.this,arr1);
//6将适配器和布局管理器加载到控件当中
StaggeredGridLayoutManager st=new StaggeredGridLayoutManager(StaggeredGridLayoutManager.VERTICAL,1);
recy_view.setLayoutManager(st);
recy_view.setAdapter(adapter);
}
//2 绑定控件----------------代码
private void initView() {
recy_view=findViewById(R.id.recy_view_indetail);
mhelper=new MyDBHelper(InComeDetailActivity.this);
db=mhelper.getWritableDatabase();
}
//3 准备数据----------------代码
private void initData() {
//从数据库查询所有的新增收入信息,取出数据
Cursor cursor=db.rawQuery("select * from in_come",null);
while(cursor.moveToNext()){
int myid=cursor.getInt(cursor.getColumnIndex("id"));
double mymoney=cursor.getDouble(cursor.getColumnIndex("inmoney"));
String mytime=cursor.getString(cursor.getColumnIndex("intime"));
String mytype=cursor.getString(cursor.getColumnIndex("intype"));
String mypayer=cursor.getString(cursor.getColumnIndex("inpayer"));
String myremark=cursor.getString(cursor.getColumnIndex("inremark"));
IncomeBean incomeBean=new IncomeBean( myid,mymoney,mytime,mytype,mypayer,myremark);
arr1.add(incomeBean);
}
}
}
子布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/in_detail_bg"
tools:context=".activity.InComeDetailActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy_view_indetail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="120dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:layout_marginBottom="40dp"/>
</LinearLayout>
收入明细运行界面如图5.7所示:
图5.7 收入明细页面
5.1.6 新增支出模块
新增支出模块功能的实现,首先创建一个NewPayActivity页面,将用户输入的内容保存到数据库的支出表中。
部分核心代码:
public class NewPayActivity extends AppCompatActivity {
//定义对象
EditText et_money,et_time,et_payer,et_remark;
Spinner sp_type;
Button bt_sava,bt_cancel;
MyDBHelper mhelper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_pay);
//2 绑定控件
initView();
//3保存按钮功能的实现
btnSave();
//4 取消按钮功能的实现
btnCancel();
}
//2 绑定控件-------------------代码
private void initView() {
et_money=findViewById(R.id.et_money_newout);
et_time=findViewById(R.id.et_time_newout);
sp_type=findViewById(R.id.sp_type_newout);
et_payer=findViewById(R.id.et_payer_newout);
et_remark=findViewById(R.id.et_remark_newout);
bt_sava=findViewById(R.id.bt_save_newout);
bt_cancel=findViewById(R.id.bt_cancel_newout);
mhelper=new MyDBHelper(NewPayActivity.this);
db=mhelper.getWritableDatabase();
}
//3保存按钮功能的实现--------代码
private void btnSave() {
bt_sava.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取输入的内容保存到数据库的收入表中
ContentValues values=new ContentValues();
values.put("outmoney",et_money.getText().toString());
values.put("outtime",et_time.getText().toString());
values.put("outtype",sp_type.getSelectedItem().toString());
values.put("outpayee",et_payer.getText().toString());
values.put("outremark",et_remark.getText().toString());
db.insert("pay_out",null,values);
Toast.makeText(NewPayActivity.this,"保存成功",Toast.LENGTH_SHORT).show();
//刷新本页面
Intent intent=new Intent(NewPayActivity.this,NewPayActivity.class);
startActivity(intent);
finish();
}
});
}
//4 取消按钮功能的实现--------代码
private void btnCancel() {
bt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(NewPayActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
});
}
}
收入明细运行界面如图5.8所示:
图 5.8 新增支出页面
5.1.7 支出明细模块
支出明细页面主要是将用户之前输入的信息显示到一个RecyclerView布局中,所以需要准备数据,设计子布局,定义适配器,并且将适配器和布局管理器加载到控件中。
部分核心代码:
public class PayDetailActivity extends AppCompatActivity {
//1定义对象
RecyclerView recy_view;
MyDBHelper mhelper;
SQLiteDatabase db;
List<OutpayBean> arr1=new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pay_detail);
//2 绑定控件
initView();
//3 准备数据
initData();
//4 设计每一行的子布局
//5 创建适配器
OutpayAdapter adapter=new OutpayAdapter(PayDetailActivity.this,arr1);
//6将适配器和布局管理器加载到控件当中
StaggeredGridLayoutManager st=new StaggeredGridLayoutManager(StaggeredGridLayoutManager.VERTICAL,1);
recy_view.setLayoutManager(st);
recy_view.setAdapter(adapter);
}
//2 绑定控件----------------代码
private void initView() {
recy_view=findViewById(R.id.recy_view_outdetail);
mhelper=new MyDBHelper(PayDetailActivity.this);
db=mhelper.getWritableDatabase();
}
//3 准备数据------------------代码
private void initData() {
//从数据库查询所有的新增收入信息,取出数据
Cursor cursor=db.rawQuery("select * from pay_out",null);
while(cursor.moveToNext()){
int myid=cursor.getInt(cursor.getColumnIndex("id"));
double mymoney=cursor.getDouble(cursor.getColumnIndex("outmoney"));
String mytime=cursor.getString(cursor.getColumnIndex("outtime"));
String mytype=cursor.getString(cursor.getColumnIndex("outtype"));
String mypayer=cursor.getString(cursor.getColumnIndex("outpayee"));
String myremark=cursor.getString(cursor.getColumnIndex("outremark"));
OutpayBean outpayBean=new OutpayBean( myid,mymoney,mytime,mytype,mypayer,myremark);
arr1.add(outpayBean);
}
}
}
子布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/pay_detail_bg"
tools:context=".activity.PayDetailActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy_view_outdetail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="120dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:layout_marginBottom="40dp"/>
</LinearLayout>
收入明细运行界面如图5.9所示:
图 5.9 新增支出页面
5.1.8 数据分析模块
数据分析页面主要是将用户之前输入的收入和支出信息通过图表的形式直观的显示出来,并且需要根据分类来显示。步骤是获取数据,对XY轴进行设计,将曲线进行初始化设置,将曲线展示出来。支出和收入分析的步骤是类似的。
部分核心代码:
public class DataAnalyseActivity extends AppCompatActivity {
//1 定义对象
LineChart income_chart, outpay_chart;
MyDBHelper mhelper;
SQLiteDatabase db;
String[] indata = {"学习-奖金", "补助-奖金", "比赛-奖励", "业余-兼职", "基本-工资", "福利-分红", "加班-津贴", "其他"};
//收入类型数据统计的初始值
int xxjjmoney = 0;
int bzjjmoney = 0;
int bsjlmoney = 0;
int yyjzmoney = 0;
int jbgzmoney = 0;
int flfhmoney = 0;
int jbjtmoney = 0;
int qtmoney = 0;
String[] outdata = {"电影-娱乐", "美食-畅饮", "欢乐-购物", "手机-充值", "交通-出行", "教育-培训", "社交-礼仪", "生活-日用", "其他"};
//收入类型数据统计的初始值
int dyylmoney = 0;
int mscymoney = 0;
int hlgwmoney = 0;
int sjczmoney = 0;
int jtcxmoney = 0;
int jypxmoney = 0;
int sjlymoney = 0;
int shrymoney = 0;
int othermoney = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_data_analyse);
//2 绑定控件
initView();
//3 收入汇总分析
inComeData();
//4 支出汇总分析
outComeData();
}
//2 绑定控件---------------代码
private void initView() {
income_chart = findViewById(R.id.income_chart_data);
outpay_chart = findViewById(R.id.outpay_chart_data);
mhelper = new MyDBHelper(DataAnalyseActivity.this);
db = mhelper.getWritableDatabase();
}
//3 收入汇总分析-------------------代码
private void inComeData() {
//第一部分:获取数据
Cursor cursor = db.rawQuery("select * from in_come", null);
while (cursor.moveToNext()) {
Double mymoney = cursor.getDouble(cursor.getColumnIndex("inmoney"));
String mytype = cursor.getString(cursor.getColumnIndex("intype"));
if (mytype.equals("学习-奖金")) {
xxjjmoney += mymoney;
} else if (mytype.equals("补助-奖金")) {
bzjjmoney += mymoney;
} else if (mytype.equals("比赛-奖励")) {
bzjjmoney += mymoney;
} else if (mytype.equals("业余-兼职")) {
yyjzmoney += mymoney;
} else if (mytype.equals("基本-工资")) {
jbgzmoney += mymoney;
} else if (mytype.equals("福利-分红")) {
flfhmoney += mymoney;
} else if (mytype.equals("加班-津贴")) {
jbjtmoney += mymoney;
} else if (mytype.equals("其他")) {
qtmoney += mymoney;
}
}
//第二部分:LineChart图表初始化设置---Xy轴的设置
XAxis xAxis = income_chart.getXAxis();//获取此图表的x轴轴线
YAxis yAxisleft = income_chart.getAxisLeft();//获取此图表的Y轴左侧轴线
YAxis yAxisright = income_chart.getAxisRight();//获取此图表的Y轴右侧轴线
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置X轴线的位置为底部
yAxisleft.setAxisMinimum(0f);//保证Y轴从0开始,不然会上移一点。
yAxisright.setAxisMinimum(0f);
xAxis.setValueFormatter(new IAxisValueFormatter() {//x轴自定义标签的设置
@Override
public String getFormattedValue(float v, AxisBase axisBase) {
return indata[(int) v];
}
});
//第三部分:LineDataSet曲线初始化设置
List<Entry> inentries = new ArrayList<>();//Y轴的数据
inentries.add(new Entry(0, xxjjmoney));
inentries.add(new Entry(1, bzjjmoney));
inentries.add(new Entry(2, bsjlmoney));
inentries.add(new Entry(3, yyjzmoney));
inentries.add(new Entry(4, jbgzmoney));
inentries.add(new Entry(5, flfhmoney));
inentries.add(new Entry(6, jbjtmoney));
inentries.add(new Entry(7, qtmoney));
LineDataSet lineDataSet = new LineDataSet(inentries, "金额");//代表一条线,“金额”是曲线名称
lineDataSet.setValueTextSize(25);//曲线上文字的大小
lineDataSet.setValueTextColor(Color.WHITE);//曲线上文字的颜色
lineDataSet.setDrawFilled(true);//设置折线图填充
//第四部分:曲线展示
LineData data = new LineData(lineDataSet);//创建LineData对象 属于LineChart折线图的数据集合
income_chart.setData(data);// 添加到图表中
}
//4 支出汇总分析--------------------代码
private void outComeData() {
//第一部分:获取数据
Cursor cursor = db.rawQuery("select * from pay_out", null);
while (cursor.moveToNext()) {
Double mymoney = cursor.getDouble(cursor.getColumnIndex("outmoney"));
String mytype = cursor.getString(cursor.getColumnIndex("outtype"));
if (mytype.equals("电影-娱乐")) {
dyylmoney += mymoney;
} else if (mytype.equals("美食-畅饮")) {
mscymoney += mymoney;
} else if (mytype.equals("欢乐-购物")) {
hlgwmoney += mymoney;
} else if (mytype.equals("手机-充值")) {
sjczmoney += mymoney;
} else if (mytype.equals("交通-出行")) {
jtcxmoney += mymoney;
} else if (mytype.equals("教育-培训")) {
jypxmoney += mymoney;
} else if (mytype.equals("社交-礼仪")) {
sjlymoney += mymoney;
} else if (mytype.equals("生活-日用")) {
shrymoney += mymoney;
} else if (mytype.equals("其他")) {
othermoney += mymoney;
}
}
//第二部分:LineChart图表初始化设置---Xy轴的设置
XAxis xAxis = outpay_chart.getXAxis();//获取此图表的x轴轴线
YAxis yAxisleft = outpay_chart.getAxisLeft();//获取此图表的Y轴左侧轴线
YAxis yAxisright = outpay_chart.getAxisRight();//获取此图表的Y轴右侧轴线
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置X轴线的位置为底部
yAxisleft.setAxisMinimum(0f);//保证Y轴从0开始,不然会上移一点。
yAxisright.setAxisMinimum(0f);
xAxis.setValueFormatter(new IAxisValueFormatter() {//x轴自定义标签的设置
@Override
public String getFormattedValue(float v, AxisBase axisBase) {
return outdata[(int) v];
}
});
//第三部分:LineDataSet曲线初始化设置
List<Entry> outentries = new ArrayList<>();//Y轴的数据
outentries.add(new Entry(0, dyylmoney));
outentries.add(new Entry(1, mscymoney));
outentries.add(new Entry(2, hlgwmoney));
outentries.add(new Entry(3, sjczmoney));
outentries.add(new Entry(4, jtcxmoney));
outentries.add(new Entry(5, jypxmoney));
outentries.add(new Entry(6, sjlymoney));
outentries.add(new Entry(7, shrymoney));
outentries.add(new Entry(8, othermoney));
LineDataSet lineDataSet = new LineDataSet(outentries, "金额");//代表一条线,“金额”是曲线名称
lineDataSet.setValueTextSize(25);//曲线上文字的大小
lineDataSet.setValueTextColor(Color.WHITE);//曲线上文字的颜色
lineDataSet.setDrawFilled(true);//设置折线图填充
//第四部分:曲线展示
LineData data = new LineData(lineDataSet);//创建LineData对象 属于LineChart折线图的数据集合
outpay_chart.setData(data);// 添加到图表中
}
}
收入明细运行界面如图5.10所示:
图 5.10 新增支出页面
5.1.9 系统设置模块
系统设置页面的作用是修改密码,目的是如果用户对自己的密码安全性不够满意时可做修改。
部分核心代码:
public class SysSettingActivity extends AppCompatActivity {
//1 定义对象
TextView txt_user;//创建一个显示用户名的文本对象
EditText et_ypwd, et_xpwd, et_zxpwd;// 创建三个EditText对象
Button bt_modify, bt_cancel;// 创建两个Button对象
MyDBHelper mhelper;
SQLiteDatabase db;
String name;
String pwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sys_setting);
//第二步:绑定控件
initView();
//第三步:显示当前登录的用户名
displayInfo();
//第四步:修改按钮功能
btnModify();
//第五步:取消按钮功能
btncancel();
}
//第二步:绑定控件-----------------代码
private void initView() {
txt_user=findViewById(R.id.txt_name_sys);
et_ypwd=findViewById(R.id.et_ypwd_sys);
et_xpwd=findViewById(R.id.et_xpwd_sys);
et_zxpwd=findViewById(R.id.et_zxpwd_sys);
bt_modify=findViewById(R.id.bt_modify_sys);
bt_cancel=findViewById(R.id.bt_cancel_sys);
mhelper=new MyDBHelper(SysSettingActivity.this);
db=mhelper.getWritableDatabase();
}
//第三步:显示当前登录的用户名-------代码
private void displayInfo() {
name=getSharedPreferences("userinfo",0).getString("username","");
pwd=getSharedPreferences("userinfo",0).getString("userpwd","");
txt_user.setText(name);
}
//第四步:修改按钮功能----------------------代码
private void btnModify() {
bt_modify.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取三个输入框中的内容
String ypwd = et_ypwd.getText().toString();//获取输入的原密码
String xpwd = et_xpwd.getText().toString();//获取输入的新密码
String zxpwd = et_zxpwd.getText().toString();//获取第二次输入的新密码
//对每个密码进行逻辑判断
if(ypwd.equals("")){
Toast.makeText(SysSettingActivity.this, "请输入原始密码", Toast.LENGTH_SHORT).show();
}else if(!ypwd.equalsIgnoreCase(pwd)){
Toast.makeText(SysSettingActivity.this, "输入的密码与原密码不一致", Toast.LENGTH_SHORT).show();
}else if(xpwd.equals("")){
Toast.makeText(SysSettingActivity.this, "请输入新密码", Toast.LENGTH_SHORT).show();
}else if(xpwd.equalsIgnoreCase(ypwd)){
Toast.makeText(SysSettingActivity.this, "所输入的新密码与原密码不能相同", Toast.LENGTH_SHORT).show();
}else if(zxpwd.equals("")){
Toast.makeText(SysSettingActivity.this, "请再次输入新密码", Toast.LENGTH_SHORT).show();
}else if(!zxpwd.equalsIgnoreCase(xpwd)){
Toast.makeText(SysSettingActivity.this, "两次输入的新密码不一致", Toast.LENGTH_SHORT).show();
}else{
ContentValues values =new ContentValues();
values.put("pwd",xpwd);
db.update("tb_userinfo",values,"name=?",new String[]{name});
Toast.makeText(SysSettingActivity.this, "密码修改成功", Toast.LENGTH_SHORT).show();
Intent intent=new Intent(SysSettingActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
}
});
}
//第五步:取消按钮功能-----------------------代码
private void btncancel() {
bt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(SysSettingActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
});
}
}
系统设置界面如图5.11所示:
图 5.11 新增支出页面
5.1.10 修改和删除模块
修改和删除页面的作用是修改用户之前输入的新增收入或新增支出信息。 如果修改使用update,如果删除,使用delete。
部分核心代码:
public class InManageActivity extends AppCompatActivity {
//1 定义对象
private EditText et_money, et_time, et_payer, et_remark;
private Spinner sp_type;
private Button btn_modify, btn_delete;
private MyDBHelper mhelper;
private SQLiteDatabase db;
private IncomeBean incomeBean;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_in_manage);
//2 绑定控件
initView();
//3 获取单击的那条数据并显示出来
getDataDisplay();
//4 修改按钮功能的实现
btnModidfy();
//5 删除按钮功能的实现
btnDelete();
}
//2 绑定控件-----------------------代码
private void initView() {
et_money = findViewById(R.id.et_money_inmag);
et_time = findViewById(R.id.et_time_inmag);
sp_type = findViewById(R.id.sp_type_inmag);
et_payer = findViewById(R.id.et_payer_inmag);
et_remark = findViewById(R.id.et_remark_inmag);
btn_modify = findViewById(R.id.bt_modify_inmag);
btn_delete = findViewById(R.id.bt_delete_inmag);
mhelper = new MyDBHelper(InManageActivity.this);
db = mhelper.getWritableDatabase();
}
//3 获取单击的那条数据并显示出来--------------------代码
private void getDataDisplay() {
incomeBean = (IncomeBean) getIntent().getSerializableExtra("seri");
et_money.setText(incomeBean.getMoney() + "");
et_time.setText(incomeBean.getTime());
//sp_type.setPrompt(incomeBean.getType());
if (incomeBean.getType().equals("学习-奖金")) {
sp_type.setSelection(1);
} else if (incomeBean.getType().equals("补助-奖金")) {
sp_type.setSelection(2);
} else if (incomeBean.getType().equals("比赛-奖励")) {
sp_type.setSelection(3);
} else if (incomeBean.getType().equals("业余-兼职")) {
sp_type.setSelection(4);
} else if (incomeBean.getType().equals("基本-工资")) {
sp_type.setSelection(5);
} else if (incomeBean.getType().equals("福利-分红")) {
sp_type.setSelection(6);
} else if (incomeBean.getType().equals("加班-津贴")) {
sp_type.setSelection(7);
} else if (incomeBean.getType().equals("其他")) {
sp_type.setSelection(8);
} else {
sp_type.setSelection(0);
}
et_payer.setText(incomeBean.getPayer());
et_remark.setText(incomeBean.getRemark());
}
//4 修改按钮功能的实现--------------------代码
private void btnModidfy() {
btn_modify.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建一个对象,封装一行数据
ContentValues values = new ContentValues();
values.put("inmoney", et_money.getText().toString());
values.put("intime", et_time.getText().toString());
values.put("intype", sp_type.getSelectedItem().toString());
values.put("inpayer", et_payer.getText().toString());
values.put("inremark", et_remark.getText().toString());
//把该行数据更新到到收入表中
db.update("in_come", values, "id=?", new String[]{incomeBean.getId() + ""});
Toast.makeText(InManageActivity.this, "修改成功", Toast.LENGTH_SHORT).show();
//关闭本页面,重新打开收入明细界面,即可查询修改后的结果
// 创建Intent对象
Intent intent = new Intent(InManageActivity.this, InComeDetailActivity.class);
startActivity(intent);// 执行Intent操作
finish();//退出当前程序,或关闭当前页面
}
});
}
//5 删除按钮功能的实现-------------------代码
private void btnDelete() {
btn_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//从数据库中删除条记录即可
db.delete("in_come", "id=?", new String[]{incomeBean.getId() + ""});
Toast.makeText(InManageActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
//关闭本页面,重新打开收入明细界面,即可删除后的结果
// 创建Intent对象
Intent intent = new Intent(InManageActivity.this, InComeDetailActivity.class);
startActivity(intent);// 执行Intent操作
finish();//退出当前程序,或关闭当前页面
}
});
}
}
收入明细运行界面如图5.12,5.13所示:
图 5.12 收入管理页面 图 5.113 支出管理页面
6 系统的测试及调试
基本的开发完成后,将APP进行Apk打包,安装到自己的真机上使用。
当完成系统的详细设计后,需要对系统各功能模块进行完整的测试及调试,在测试过程中会发现好多问题,只有通过不断地修正和优化,才能使系统更加稳定和可靠。在调试过程中还可以优化部分代码,使整体的代码结构更加紧凑和精简。为确保系统每个功能都能正常稳定地实现,测试中需以单个模块逐个测试,经过多次反复的测试,本系统在设计过程中出现过以下问题:
- 在代码编写过程中由于各个功能模块命名不规范,导致后期出现过很多细节 上的问题,比如首字母大小写区别,后来在调用程序时由于字段不统一导致程序出错,不过在测试时会生成相应的错误报告信息,相对来说还是比较容易更正的。
- 在代码编写完成后,做了初步测试,但发现系统始终不能正常运行,查看日志信息发现是内存溢出异常,查阅了很多相关资料,最终确定问题出在初始启动页面错误上。
系统测试与调试的过程能够加深对本设计具体要求的理解。经过前期的需求分析、概要设计以及系统详细设计等过程,真正体会到软件设计的精髓,即规划、整理和思维创新。每一个微小的设计细节都会影响到整个软件成型的质量。
7 结论
本次的研究的课题是一个移动端APP的开发。本次课题所涉及的知识点很多都是自己以前不太清楚的,算是对自己的一个挑战了。通过Java开发技术的运用,功能 模块化的设计以及后期系统测试与调试,此系统所要求的功能已基本实现。通过一段时间的的开发过程,对一个应用的开发流程有了更全面的了解。
此外,有序的软件开发管理流程可以让整个开发过程变得更有条理和高效,而系统的需求分析与系统概要设计显得尤为重要。需求分析是整个系统开发流程的开头,确定了本设计的工作方向,只有明确了目标,对预期的功能有个初步的描述,才能在之后制定更详细的设计步骤,更加有效的管理系统功能布局,并按预期的目标去逐步靠近。而系统概要设计为系统详细设计提供了重要的理论依据和技术指导。
本软件从前期的需求分析到系统测试运行的成功标志着整个开发流程的结束。但由于自身能力的局限,本系统还需后期不断地优化和升级。特别是考虑到用户的各方面需求,还可以在系统里添加一些更具人性化的功能设计,比如添加一个显示总收入的TextView控件,添加根据日期显示的图表化功能等。有了这些子功能,可以让用户的体验感更好,能更好的管理自己的收入和支出,成为金钱的主人,早日实现财富自由。
希望能够通过不断地探索和学习,逐步学习和应用新的技术,能够进一步去完善该系统的功能。
标签:findViewById,App,cursor,void,new,et,Android,财付,id From: https://blog.csdn.net/m0_66999594/article/details/139441127