记账本的设计与实现

一、需求分析

1.1特性需求分析

(1):易操作和功能简单明确不令人误解。一个良好的个人记账本应该功能明确,用户可以很明了的通过界面介绍明白各项功能的实现方法大,而不是看到界面不知道按钮的具体用途,及操作简单,界面友好易懂。用户可以根据手机界面很清楚的进行记账,删除,查账,更改等功能。

(2):软件功能流畅,软件在运行不能发生崩溃,卡顿等问题,整个页面操作起来很流畅。

(3)软件以维护,系统各个模块设计应该很明确,核心代码处应有必要的注释,使得今后的软件维护能够顺利地进行。

1.2功能需求分析

用户应该能实现添加账单,查询账户信息,显示消费记录,显示余额四大功能。

(1)用户添加账单功能:利用计算器输入价钱并选择消费用途,例如(餐饮,娱乐,水果,日常),并选择消费方式(现金,支付宝,银行卡)。

(2)查询账户信息:用户可以在我的账户页面查询消费记录,详细地记录了消费用途,消费金额以及支付方式,同时也记录了消费金额及账户余额。并且可以进行修改账户和添加收入等操作。

(3)显示消费记录:系统制定出一份分类帐单,详细地记录了消费用途及消费金额。

二、总体设计

2.1系统总功能结构图

2.2 E-R模型

2.2.1 总的E-R模型

2.2.2 记录的E-R模型

2.2.3 账户的E-R模型

2.3数据库设计

三、系统测试

3.1查询账单

进入首页便是账单、余额、消费金额

3.2 添加记录

经操作,可以手动输入,也可以通过计算器计算输入

3.3 查看个人账户

可以查看,可以修改个人账户,也可以添加收入

3.4 查看分类消费

点击余额,可以查看个人消费的分类信息

3.5总结

经过测试,程序可以使用。

四、系统实现

4.1主页

4.1.2显示主页的内容(MainActivity)

public void ListViewRecord() {

// 获取所有账单信息

ridlist = rid.findAll();

ArrayList> list = new ArrayList>();

// 要将goodslist中的内容格式改变,让适配器可识别

for (RecordInfo record : ridlist) {

Map map = new HashMap();

map.put("type", record.getType());

map.put("money", "¥" +record.getMoney());

sum = sum + record.getMoney();

map.put("payway", record.getPayway());

list.add(map);

}

SimpleAdapter listAdapter = new SimpleAdapter(MainActivity.this, list,

R.layout.details_style, new String[] { "type", "money",

"payway" }, new int[] { R.id.tv_type, R.id.tv_money,

R.id.tv_payway });

lv_details.setAdapter(listAdapter);

}

4.2记账页面

4.2.1显示记账页面(RecordActivity)

private void executeExpression() {

try {

// 调用第三方jar包来执行运算

total = Calculator.execute(content);

} catch (Exception e) {

total = "0";

return;

}

et_money.setText(total);

}

class ButtonClickListener implements OnClickListener {

@Override

public void onClick(View v) {

Button button = (Button) v;

content = et_money.getText().toString();

switch (button.getId()) {

case R.id.bt_one:

content = content + "1";

et_money.setText(content);

break;

case R.id.bt_two:

content = content + "2";

et_money.setText(content);

break;

case R.id.bt_three:

content = content + "3";

et_money.setText(content);

break;

case R.id.bt_four:

content = content + "4";

et_money.setText(content);

break;

case R.id.bt_five:

content = content + "5";

et_money.setText(content);

break;

case R.id.bt_six:

content = content + "6";

et_money.setText(content);

break;

case R.id.bt_seven:

content = content + "7";

et_money.setText(content);

break;

case R.id.bt_eight:

content = content + "8";

et_money.setText(content);

break;

case R.id.bt_nine:

content = content + "9";

et_money.setText(content);

break;

case R.id.bt_zero:

content = content + "0";

et_money.setText(content);

break;

case R.id.bt_plus:

content = content + "+";

et_money.setText(content);

break;

case R.id.bt_min:

content = content + "-";

et_money.setText(content);

break;

case R.id.bt_mud:

content = content + "*";

et_money.setText(content);

break;

case R.id.bt_div:

content = content + "/";

et_money.setText(content);

break;

case R.id.bt_backspace:

content = content.substring(0, content.length()-1);

et_money.setText(content);

break;

case R.id.bt_point:

content = content + ".";

et_money.setText(content);

break;

case R.id.bt_left:

content = content + "(";

et_money.setText(content);

break;

case R.id.bt_right:

content = content + ")";

et_money.setText(content);

break;

case R.id.bt_equal:

executeExpression();

content = "";

break;

}

}}

4.3 分类帐单

4.3.1显示分类账单内容(TypeActivity)

public void show() {

for (RecordInfo record : recordlist) {

String type = record.getType();

if (type.equals("餐饮")) {

sum_food = record.getMoney() + sum_food;

}else if(type.equals("水果")){

sum_fruit = record.getMoney() + sum_fruit;

}else if(type.equals("娱乐")){

sum_fun = record.getMoney() + sum_fun;

}else if(type.equals("日常")){

sum_daily = record.getMoney() + sum_daily;

}

}

tv_food.setText("¥" + sum_food);

tv_fruit.setText("¥" + sum_fruit);

tv_fun.setText("¥" + sum_fun);

tv_daily.setText("¥" + sum_daily);

}

4.4收入页面

4.4.1添加收入(IncomeActivity)

class onclickListener implements OnClickListener {

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.tv_cash:

tv_cash.setBackgroundColor(color.darker_gray);

Toast.makeText(IncomeActivity.this, "现金", Toast.LENGTH_SHORT)

.show();

type = "现金";

break;

case R.id.tv_card:

tv_card.setBackgroundColor(color.darker_gray);

Toast.makeText(IncomeActivity.this, "银行卡", Toast.LENGTH_SHORT)

.show();

type = "银行卡";

break;

case R.id.tv_alipay:

tv_alipay.setBackgroundColor(color.darker_gray);

Toast.makeText(IncomeActivity.this, "支付宝", Toast.LENGTH_SHORT)

.show();

type = "支付宝";

break;

case R.id.bt_ok:

boolean b = false;

if (null == et_money.getText().toString().trim()

|| et_money.getText().toString().trim().equals("")) {

Toast.makeText(IncomeActivity.this, "收入为0",

Toast.LENGTH_SHORT).show();

} else {

money = Double.parseDouble(et_money.getText().toString());

b = cid.IncomeCount(type, money);

if (b) {

Intent intent = new Intent(IncomeActivity.this,

MainActivity.class);

startActivity(intent);

IncomeActivity.this.finish();

}

}

break;

case R.id.bt_quit:

Intent intent1 = new Intent(IncomeActivity.this,

MainActivity.class);

startActivity(intent1);

IncomeActivity.this.finish();

break;

}

}

}

4.5更新用户信息页面

4.5.1修改账户资金(UpdateCountActivity)

public void toAdd(View v){

money = Double.parseDouble(et_money.getText().toString());

boolean b = false ;

b = cid.updateCount(type,money);

if(b){

Intent intent = new Intent(UpdateCountActivity.this,CountActivity.class);

startActivity(intent);

UpdateCountActivity.this.finish();

}

}

4.6我的账户页面

4.6.1显示账户信息

class onclickListener implements OnClickListener{

@Override

public void onClick(View v) {

Intent intent = new Intent(CountActivity.this,UpdateCountActivity.class);

switch(v.getId()){

case R.id.rl_cash:

intent.putExtra("type","现金");

startActivity(intent);

CountActivity.this.finish();

break;

case R.id.rl_card:

intent.putExtra("type","银行卡");

startActivity(intent);

CountActivity.this.finish();

break;

case R.id.rl_alipay:

intent.putExtra("type","支付宝");

startActivity(intent);

CountActivity.this.finish();

break;

}

}

}

public void ListViewCount() {

// 获取所有账户信息

cinfo = cid.find();

tv_cash.setText("¥"+cinfo.getCash());

tv_card.setText("¥"+cinfo.getCard()+"");

tv_alipay.setText("¥"+cinfo.getAlipay()+"");

}

public void toBack(View view){

Intent intent = new Intent(CountActivity.this,MainActivity.class);

startActivity(intent);

CountActivity.this.finish();

}

public void toIncome(View view){

Intent intent = new Intent(CountActivity.this,IncomeActivity.class);

startActivity(intent);

CountActivity.this.finish();

}

4.7对账户进行操作

4.7.1查找账户信息

public CountInfo find() {

SQLiteDatabase db = dbHelper.getReadableDatabase();

String sql = "select * from tbl_count where uid = 1001";

Cursor cursor = db.rawQuery(sql, null);

// 用一个list来存储每一个GoodsInfo 对象的值

CountInfo list = new CountInfo();

while (cursor.moveToNext()) {

Double cash = cursor.getDouble(cursor.getColumnIndex("cash"));

Double card = cursor.getDouble(cursor.getColumnIndex("card"));

Double alipay = cursor.getDouble(cursor.getColumnIndex("alipay"));

list = new CountInfo(1001, cash, card, alipay);

}

db.close();

cursor.close();

return list;

}

4.7.2更新账户信息(购买后修改)

@Override

public boolean updateCount(RecordInfo record) {

if (null != record) {

// 获取一个可写入的数据库

CountInfo count = find();

SQLiteDatabase db = dbHelper.getWritableDatabase();

String payway = record.getPayway().trim();

String sql = null;

double money = 0.0;

if (payway.equals("现金")) {

money = count.getCash();

sql = "update tbl_count set cash=? where uid=1001";

} else if (payway.equals("银行卡")) {

money = count.getCard();

sql = "update tbl_count set card=? where uid=1001";

} else if (payway.equals("支付宝")) {

money = count.getAlipay();

sql = "update tbl_count set alipay=? where uid=1001";

}

money = money - record.getMoney();

db.execSQL(sql, new Object[] {money});

db.close();

return true;

} else {

return false;

}

}

4.7.3更新账户信息(直接修改账户信息)

public boolean updateCount(String type ,double money) {

if (null != type) {

// 获取一个可写入的数据库

SQLiteDatabase db = dbHelper.getWritableDatabase();

String sql = null;

if (type.equals("现金")) {

sql = "update tbl_count set cash=? where uid=1001";

} else if (type.equals("银行卡")) {

sql = "update tbl_count set card=? where uid=1001";

} else if (type.equals("支付宝")) {

sql = "update tbl_count set alipay=? where uid=1001";

}

db.execSQL(sql, new Object[] {money});

db.close();

return true;

} else {

return false;

}

}

4.7.4更新账户信息(添加收入)

@Override

public boolean IncomeCount(String type, double money) {

CountInfo count = find();

if (null != type) {

// 获取一个可写入的数据库

SQLiteDatabase db = dbHelper.getWritableDatabase();

String sql = null;

if (type.equals("现金")) {

sql = "update tbl_count set cash=? where uid=1001";

money = count.getCash() + money;

} else if (type.equals("银行卡")) {

sql = "update tbl_count set card=? where uid=1001";

money = count.getCard() + money;

} else if (type.equals("支付宝")) {

sql = "update tbl_count set alipay=? where uid=1001";

money = count.getAlipay() + money;

}

db.execSQL(sql, new Object[] {money});

db.close();

return true;

} else {

return false;

}

}

}

4.9初始化数据库

public void onCreate(SQLiteDatabase db) {

db.execSQL("create table if not exists tbl_users"

+ "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , uname String ,"

+ "upwd String )");

db.execSQL("insert into tbl_users values (1001,'admin','admin')");

db.execSQL("create table if not exists tbl_admin"

+ "(rid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , type String ,"

+ "money Double ,payway String)");

db.execSQL("create table if not exists tbl_count"

+ "(cid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , uid Integer, cash Double ,"

+ "card Double ,alipay Double)");

db.execSQL("insert into tbl_count values (1,1001,0,0,0)");

}

五、总结

这次的课程设计时间比较短,所以完成的项目也不算完美,不过还是自己本身的问题,在这个学期学习的并不好,基础比较差。真正来做项目的时候就显示出了自己的不足,很多都不懂,好多都是现学的。项目并不是很难,不过确实能学到很多东西。

在系统测试过程中,系统可以在模拟器和真机上正常运行这些功能,能够满足系统的基本要求。但是也能发现系统中存在的小缺陷,对于这些小缺陷,也尽力作了修改。另外,在界面美化和流程控制方面还有待优化,以提高用户的体

安卓课程设计之记账本_基于Android个人用户记账本系统课程设计报告相关推荐

  1. 项目_基于Android的信息化医疗服务系统

    文章目录 基于Android的信息化医疗服务系统 1.前言 2.项目背景 3.概要设计 3.1.系统概要 3.2.系统结构 3.2.功能设计 3.2.1.管理员 3.2.2.医生 3.2.3.用户 3 ...

  2. 基于Android的多功能日程表,基于android的多功能日程表系统的设计与实现.doc

    最新精品文档,知识共享! 烟台大学毕业论文(设计)任务书 院(系):计算机与控制工程学院 姓名 于文英 学号 201158504444 毕业届别 2015 专业 软件工程 毕业论文(设计)题目 基于A ...

  3. 基于Android的app公交查询论文,基于Android平台的公交查询系统的设计与实现.doc

    摘要:本系统是在Android开发平台上,基于百度地图API实现的.解决的问题是随着城市的不断扩增,所导致的盐城市公交信息不能有效分享的情况.现在人们出行时的选择越来越多,但是公交仍然是大部分市民的首 ...

  4. android日记 设计说明,基于Android的掌上校园系统的设计与实现毕业论文.doc

    中文题目:基于Android的掌上校园系统的设计与实现 外文题目:THE DESIGN AND IMPLEMENTATION OF A HANDHELD CAMPUS SYSTEM BASED ON ...

  5. java ee 物联网 论文_基于物联网的智能社区互助系统的设计研究论文

    基于物联网的智能社区互助系统的设计研究论文 1 绪论 目前行业内的智能社区解决方案分为两大阵营,无线阵营和总线阵营,无线阵营主张以互联网为平台,底层传感网使用短距离无线的传输网,并通过耦合两个异构网络 ...

  6. 基于单片机的自动追日系统设计_基于单片机的自动浇花系统的设计

    龙源期刊网 http://www.qikan.com.cn 基于单片机的自动浇花系统的设计 作者:吴蓓 张阳 来源:<现代信息科技> 2018 年第 03 期 摘 要:为了解决人们生活中由 ...

  7. 基于Java的设计开题报告_基于Java的电子邮件的收发系统的设计与实现开题报告...

    基于Java的电子邮件的收发系统的设计与实现开题报告 (8页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 开题报告 基于 Java 的电子 ...

  8. java网页作业提交_基于JAVA网上作业提交批改系统的设计(SQL)(含录像)

    基于JAVA网上作业提交批改系统的设计(SQL)(含录像)(毕业论文15000字,程序代码,SQLserver数据库) 摘  要 随着社会的进步,网络技术的发展为教育界提供了一片崭新的空间,传统的教学 ...

  9. MySQL长途售票系统_基于SSH的长途汽车票务售票系统的设计(Struts2,MySQL)(含录像)...

    基于SSH的长途汽车票务售票系统的设计(Struts2,MySQL)(含录像)(毕业论文说明书14000字,程序代码,MySQL数据库)摘  要 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功 ...

最新文章

  1. 2、MySQL使用(DISTINCT)过滤重复数据
  2. mysql数据库utf-8编码
  3. 从人工到机器智能,盗版监测在 AI 时代如何破局?
  4. C#实验室常用软件-Windows Live Writer
  5. TWiki 语法格式(TWiki语法教程及TWiki使用技巧)
  6. buildroot自带程序(库)编译并安装
  7. 有线网卡驱动_WDS如何为boot.wim或install.wim添加驱动
  8. JavaWeb书城项目(尚硅谷视频整理自用)
  9. Excel查询两列值的差异 -- VLOOPUP
  10. 强化学习10——迭代学习
  11. lay-verify的失效情况
  12. 为了讨好程序员,阿里云和 Costa 开了家码农咖啡馆
  13. 策划入门(三)创意的价值和如何写故事
  14. 微信小程序base64图片转换临时链接
  15. 《JAVASE系列》抽象类与接口
  16. vlookup java_Vlookup的VBA错误处理
  17. redisson中的看门狗机制总结
  18. idea全局替换yml 报错:you have entered malformed replacement
  19. 安卓手机阅读器_【BOOX彩屏】彩色墨水屏阅读器,BOOX Poke2 Color 使用体验
  20. Windows server2008 R2显卡驱动和Windows server2012 R2兼容吗

热门文章

  1. EBS中应用,职责,数据组,请求组等关系
  2. 风格迁移 I2I 论文阅读笔记——U-GAT-IT,动漫风格生成
  3. linkerd mysql_《Linkerd官方文档》在本地运行Linkerd
  4. B 站神曲 damedane:精髓在于深度变换,五分钟就能学会
  5. 【系统集成项目管理工程师】项目范围管理
  6. Hwclock用法介绍
  7. 学生网页设计成品展示 静态HTML网页设计HTML5 dreamweaver作品展示2022.08期
  8. 【个人网站搭建】服务器、域名准备
  9. 阿里云将全面提供IPv6服务 | 中国制造业正被双向挤压,需智能化发展
  10. Tensorboard无法显示图像