记账本的设计与实现
一、需求分析
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)
publicvoidListViewRecord() {
// 获取所有账单信息
ridlist= rid.findAll();
ArrayList> list = newArrayList>();
// 要将goodslist中的内容格式改变,让适配器可识别
for(RecordInfo record : ridlist) {
Map map = newHashMap();
map.put("type", record.getType());
map.put("money", "¥"+record.getMoney());
sum= sum+ record.getMoney();
map.put("payway", record.getPayway());
list.add(map);
}
SimpleAdapter listAdapter = newSimpleAdapter(MainActivity.this, list,
R.layout.details_style, newString[] { "type", "money",
"payway"}, newint[] { R.id.tv_type, R.id.tv_money,
R.id.tv_payway});
lv_details.setAdapter(listAdapter);
}
4.2记账页面
4.2.1显示记账页面(RecordActivity)
privatevoidexecuteExpression() {
try{
// 调用第三方jar包来执行运算
total= Calculator.execute(content);
} catch(Exception e) {
total= "0";
return;
}
et_money.setText(total);
}
classButtonClickListener implementsOnClickListener {
@Override
publicvoidonClick(View v) {
Button button = (Button) v;
content= et_money.getText().toString();
switch(button.getId()) {
caseR.id.bt_one:
content= content+ "1";
et_money.setText(content);
break;
caseR.id.bt_two:
content= content+ "2";
et_money.setText(content);
break;
caseR.id.bt_three:
content= content+ "3";
et_money.setText(content);
break;
caseR.id.bt_four:
content= content+ "4";
et_money.setText(content);
break;
caseR.id.bt_five:
content= content+ "5";
et_money.setText(content);
break;
caseR.id.bt_six:
content= content+ "6";
et_money.setText(content);
break;
caseR.id.bt_seven:
content= content+ "7";
et_money.setText(content);
break;
caseR.id.bt_eight:
content= content+ "8";
et_money.setText(content);
break;
caseR.id.bt_nine:
content= content+ "9";
et_money.setText(content);
break;
caseR.id.bt_zero:
content= content+ "0";
et_money.setText(content);
break;
caseR.id.bt_plus:
content= content+ "+";
et_money.setText(content);
break;
caseR.id.bt_min:
content= content+ "-";
et_money.setText(content);
break;
caseR.id.bt_mud:
content= content+ "*";
et_money.setText(content);
break;
caseR.id.bt_div:
content= content+ "/";
et_money.setText(content);
break;
caseR.id.bt_backspace:
content= content.substring(0, content.length()-1);
et_money.setText(content);
break;
caseR.id.bt_point:
content= content+ ".";
et_money.setText(content);
break;
caseR.id.bt_left:
content= content+ "(";
et_money.setText(content);
break;
caseR.id.bt_right:
content= content+ ")";
et_money.setText(content);
break;
caseR.id.bt_equal:
executeExpression();
content= "";
break;
}
}}
4.3 分类帐单
4.3.1显示分类账单内容(TypeActivity)
publicvoidshow() {
for(RecordInfo record : recordlist) {
String type = record.getType();
if(type.equals("餐饮")) {
sum_food= record.getMoney() + sum_food;
}elseif(type.equals("水果")){
sum_fruit= record.getMoney() + sum_fruit;
}elseif(type.equals("娱乐")){
sum_fun= record.getMoney() + sum_fun;
}elseif(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)
classonclickListener implementsOnClickListener {
@Override
publicvoidonClick(View v) {
switch(v.getId()) {
caseR.id.tv_cash:
tv_cash.setBackgroundColor(color.darker_gray);
Toast.makeText(IncomeActivity.this, "现金", Toast.LENGTH_SHORT)
.show();
type= "现金";
break;
caseR.id.tv_card:
tv_card.setBackgroundColor(color.darker_gray);
Toast.makeText(IncomeActivity.this, "银行卡", Toast.LENGTH_SHORT)
.show();
type= "银行卡";
break;
caseR.id.tv_alipay:
tv_alipay.setBackgroundColor(color.darker_gray);
Toast.makeText(IncomeActivity.this, "支付宝", Toast.LENGTH_SHORT)
.show();
type= "支付宝";
break;
caseR.id.bt_ok:
booleanb = 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 = newIntent(IncomeActivity.this,
MainActivity.class);
startActivity(intent);
IncomeActivity.this.finish();
}
}
break;
caseR.id.bt_quit:
Intent intent1 = newIntent(IncomeActivity.this,
MainActivity.class);
startActivity(intent1);
IncomeActivity.this.finish();
break;
}
}
}
4.5更新用户信息页面
4.5.1修改账户资金(UpdateCountActivity)
publicvoidtoAdd(View v){
money= Double.parseDouble(et_money.getText().toString());
booleanb = false;
b = cid.updateCount(type,money);
if(b){
Intent intent = newIntent(UpdateCountActivity.this,CountActivity.class);
startActivity(intent);
UpdateCountActivity.this.finish();
}
}
4.6我的账户页面
4.6.1显示账户信息
classonclickListener implementsOnClickListener{
@Override
publicvoidonClick(View v) {
Intent intent = newIntent(CountActivity.this,UpdateCountActivity.class);
switch(v.getId()){
caseR.id.rl_cash:
intent.putExtra("type","现金");
startActivity(intent);
CountActivity.this.finish();
break;
caseR.id.rl_card:
intent.putExtra("type","银行卡");
startActivity(intent);
CountActivity.this.finish();
break;
caseR.id.rl_alipay:
intent.putExtra("type","支付宝");
startActivity(intent);
CountActivity.this.finish();
break;
}
}
}
publicvoidListViewCount() {
// 获取所有账户信息
cinfo= cid.find();
tv_cash.setText("¥"+cinfo.getCash());
tv_card.setText("¥"+cinfo.getCard()+"");
tv_alipay.setText("¥"+cinfo.getAlipay()+"");
}
publicvoidtoBack(View view){
Intent intent = newIntent(CountActivity.this,MainActivity.class);
startActivity(intent);
CountActivity.this.finish();
}
publicvoidtoIncome(View view){
Intent intent = newIntent(CountActivity.this,IncomeActivity.class);
startActivity(intent);
CountActivity.this.finish();
}
4.7对账户进行操作
4.7.1查找账户信息
publicCountInfo find() {
SQLiteDatabase db = dbHelper.getReadableDatabase();
String sql = "select * from tbl_count where uid = 1001";
Cursor cursor = db.rawQuery(sql, null);
// 用一个list来存储每一个GoodsInfo 对象的值
CountInfo list = newCountInfo();
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 = newCountInfo(1001, cash, card, alipay);
}
db.close();
cursor.close();
returnlist;
}
4.7.2更新账户信息(购买后修改)
@Override
publicbooleanupdateCount(RecordInfo record) {
if(null!= record) {
// 获取一个可写入的数据库
CountInfo count = find();
SQLiteDatabase db = dbHelper.getWritableDatabase();
String payway = record.getPayway().trim();
String sql = null;
doublemoney = 0.0;
if(payway.equals("现金")) {
money = count.getCash();
sql = "update tbl_count set cash=? where uid=1001";
} elseif(payway.equals("银行卡")) {
money = count.getCard();
sql = "update tbl_count set card=? where uid=1001";
} elseif(payway.equals("支付宝")) {
money = count.getAlipay();
sql = "update tbl_count set alipay=? where uid=1001";
}
money = money - record.getMoney();
db.execSQL(sql, newObject[] {money});
db.close();
returntrue;
} else{
returnfalse;
}
}
4.7.3更新账户信息(直接修改账户信息)
publicbooleanupdateCount(String type ,doublemoney) {
if(null!= type) {
// 获取一个可写入的数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
String sql = null;
if(type.equals("现金")) {
sql = "update tbl_count set cash=? where uid=1001";
} elseif(type.equals("银行卡")) {
sql = "update tbl_count set card=? where uid=1001";
} elseif(type.equals("支付宝")) {
sql = "update tbl_count set alipay=? where uid=1001";
}
db.execSQL(sql, newObject[] {money});
db.close();
returntrue;
} else{
returnfalse;
}
}
4.7.4更新账户信息(添加收入)
@Override
publicbooleanIncomeCount(String type, doublemoney) {
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;
} elseif(type.equals("银行卡")) {
sql = "update tbl_count set card=? where uid=1001";
money = count.getCard() + money;
} elseif(type.equals("支付宝")) {
sql = "update tbl_count set alipay=? where uid=1001";
money = count.getAlipay() + money;
}
db.execSQL(sql, newObject[] {money});
db.close();
returntrue;
} else{
returnfalse;
}
}
}
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个人用户记账本系统课程设计报告》对你有帮助,请点赞、收藏,并留下你的观点哦!