基于Android的个人理财通的设计与实现

基于Android的个人理财通的设计与实现

  1. 设计目的
    使用Android 5.0技术开发一个个人理财通系统,通过该系统,可以随时随地的记录用户的收入及支出等信息。

  2. 开发环境
    操作系统: Windows 7。
    JDK环境: Java SE Development KET(JDK) version 7。
    开发工具: Eclipse 4.4.2+Android 5.0。
    开发语言: Java、XML。
    数据库管理软件: SQLite 3。
    运行平台: Windows、Linux各版本。
    分辨率: 最佳效果1440像素 * 900像素

  3. 需求分析
    为了更好地记录每月的收入及支出,这里开发了一款基于Android 系统的个人理财通软件。通过该软件,用户可以随时随地地记录自己的收入、支出等信息;另外,为了保护自己的隐私,还可以为个人理财通设置密码。

  4. 概要设计
    4.1设计思想:
    ①操作简单方便、界面简洁美观。
    ②方便的对收入及支出进行增、删、改、查等操作。
    ③通过便签方便的记录用户的计划。
    ④能够通过设置密码保证程序的安全性。
    ⑤系统运行稳定、安全可靠。
    4.2系统功能结构图
    4.3系统操作流程图

  5. 数据库设计
    5.1创建数据库
    个人理财通系统在创建数据库时,使用通过使用SQLiteOpenHelper类的构造函数来实现的,实现代码如下。

private static final int VERSION = 1;		  
private static final String DBNAME = "account.db";	  
public DBOpenHelper(Context context){		  
	super(context, DBNAME, null, VERSION);
}

5.2数据库操作
5.2.1打开关闭数据库
在SQLite数据库中,每个数据库保存在一个单独的文件中,使用“sqlite3+数据库文件名”的方式可以打开数据库文件,如果指定文件不存在,则自动创建新文件。使用的命令如下:
cd /data/data/com.mingrisoft/databases
sqlite3 mr
要退出sqlite则使用“.exit”命令
5.2.2数据库表设计

5.2.3添加数据

public void add(Tb_inaccount tb_inaccount) {
		db.execSQL(
				"insert into tb_inaccount (_id,money,time,type,handler,mark) "
				+ "values (?,?,?,?,?,?)",
				new Object[] { tb_inaccount.getid(), tb_inaccount.getMoney(),
						tb_inaccount.getTime(), tb_inaccount.getType(),
						tb_inaccount.getHandler(), tb_inaccount.getMark() });
	}

5.2.4修改数据

public void update(Tb_inaccount tb_inaccount) {
//		db = helper.getWritableDatabase();// 初始化SQLiteDatabase对象
		// 执行修改收入信息操作
		db.execSQL(
				"update tb_inaccount set money = ?,time = ?,type = ?,handler = ?,"
				+ "mark = ? where _id = ?",
				new Object[] { tb_inaccount.getMoney(), tb_inaccount.getTime(),
						tb_inaccount.getType(), tb_inaccount.getHandler(),
						tb_inaccount.getMark(), tb_inaccount.getid() });
	}

5.2.5删除数据

public void detele(Integer... ids) {
		if (ids.length > 0){// 判断是否存在要删除的id
			StringBuffer sb = new StringBuffer();// 创建StringBuffer对象
			for (int i = 0; i < ids.length; i++){// 遍历要删除的id集合
				sb.append('?').append(',');// 将删除条件添加到StringBuffer对象中
			}
			sb.deleteCharAt(sb.length() - 1);// 去掉最后一个“,“字符
//			db = helper.getWritableDatabase();// 初始化SQLiteDatabase对象
			// 执行删除收入信息操作
			db.execSQL("delete from tb_inaccount where _id in (" + sb + ")",
					(Object[]) ids);
		}
	}

5.2.6查询数据

public List getScrollData(int start, int count) {
		List tb_inaccount = new ArrayList();// 创建集合对象
//		db = helper.getWritableDatabase();// 初始化SQLiteDatabase对象
		// 获取所有收入信息
		Cursor cursor = db.rawQuery("select * from tb_inaccount limit ?,?",
				new String[] { String.valueOf(start), String.valueOf(count) });
		while (cursor.moveToNext()){// 遍历所有的收入信息
			// 将遍历到的收入信息添加到集合中
			tb_inaccount.add(new Tb_inaccount(cursor.getInt(cursor
					.getColumnIndex("_id")), cursor.getDouble(cursor
					.getColumnIndex("money")), cursor.getString(cursor
					.getColumnIndex("time")), cursor.getString(cursor
					.getColumnIndex("type")), cursor.getString(cursor
					.getColumnIndex("handler")), cursor.getString(cursor
					.getColumnIndex("mark"))));
		}
		cursor.close();// 关闭游标
		return tb_inaccount;// 返回集合
	}

  1. 详细设计与实现
    6.1收入/支出管理模块主要包括4部分,分别是“新增收入/支出”、“收入/支出信息浏览”、“修改/删除支出信息”和“收入/支出信息汇总图表”,其中,“新增收入/支出”用来添加收入/支出信息,“收入/支出信息浏览”用来显示所有的收入/支出信息,“修改/删除收入/支出出信息”用来根据编号修改或者删除收入/支出信息,“收入/支出信息汇总图表”用来统计收入/支出信息并以图表形式显示。收入/支出流程图如图所示
    6.2便签管理模块主要包括3部分,分别是“新增便签”、“便签信息浏览”和“修改/删除便签信息”,其中,“新增便签”用来添加便签信息,“便签信息浏览”用来显示所有的便签信息,“修改/删除便签信息”用来根据编号修改或者删除便签信息。
    6.3系统设置模块主要对个人理财通中的登录密码进行设置
    6.4登录模块设计:登录模块主要是通过输入正确的密码进入个人理财通的主窗体,它可以提高程序的安全性,保护数据资料不外泄。
    6.5个人理财通各界面如图所示:

  2. 总结
    从十二月开始,经过快半个月的学习奋斗,大作业到现在终于基本上已经完成了。在这段日子里从系统的需求分析开始,然后到对系统功能进行详细设计,最后到系统的编码实现,最后到大作业的完成,我通过查阅大量的图书与文献自学相关知识,同时也诚心请教同学和老师,通过与他们的交流,我学到了很多专业知识和经验,让我受益匪浅,对相关专业知识有了一个新的认识,当遇到有不认识或未曾遇到过的错误,上网寻找资料, 解决难题,让我懂得网上的资源是十分之多,令我获益良多,这些锻炼了我坚强的意志,同时也使我的专业知识更加扎实,让我在以后的人生职业道路上可以更加的自信和顽强。虽然有些功能没有完全实现,但希望经过后期的维护肯定能达到使用要求,更好完善自己系统的功能。

  3. 参考文献
    [1] 徐娜子.Android江湖[M].电子工业出版社.2011.11
    [2] 郭志宏. Android应用开发详解[M].电子工业出版社.2010.
    [3] 明日科技Android从入门到精通[M].清华大学出版社.2012.9
    [4] 杨丰盛.Android应用开发揭秘[M].机械I业出版社. 2010.
    [5] 张仕成.基于Google Android平台的应用程序开发与研究[j].电脑知识与技术2009. (5)
    [6] 靳岩,姚尚朗. Google Android开发入门与sss实践[M].人民邮电出版社.2009

  4. 附录部分源代码

package com.mingrisoft.activity;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends Activity {
	GridView gvInfo;// 创建GridView对象
	// 定义字符串数组,存储系统功能
	String[] titles = new String[] { "新增支出", "新增收入", "我的支出", "我的收入", 
			"数据管理","系统设置", "收支便签", "帮助","退出" };
	// 定义int数组,存储功能对应的图标
	int[] images = new int[] { R.drawable.addoutaccount,
			R.drawable.addinaccount, R.drawable.outaccountinfo,
			R.drawable.inaccountinfo, R.drawable.showinfo, R.drawable.sysset,
			R.drawable.accountflag, R.drawable.help,R.drawable.exit };

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		gvInfo = (GridView) findViewById(R.id.gvInfo);// 获取布局文件中的gvInfo组件
		pictureAdapter adapter = new pictureAdapter(titles, images, this);// 创建pictureAdapter对象
		gvInfo.setAdapter(adapter);// 为GridView设置数据源
		gvInfo.setOnItemClickListener(new OnItemClickListener() {// 为GridView设置项单击事件
			@Override
			public void onItemClick(AdapterView arg0, View arg1, int arg2,
					long arg3) {
				Intent intent = null;// 创建Intent对象
				switch (arg2) {
				case 0:
					intent = new Intent(MainActivity.this, AddOutaccount.class);// 使用AddOutaccount窗口初始化Intent
					startActivity(intent);// 打开AddOutaccount
					break;
				case 1:
					intent = new Intent(MainActivity.this, AddInaccount.class);// 使用AddInaccount窗口初始化Intent
					startActivity(intent);// 打开AddInaccount
					break;
				case 2:
					intent = new Intent(MainActivity.this, Outaccountinfo.class);// 使用Outaccountinfo窗口初始化Intent
					startActivity(intent);// 打开Outaccountinfo
					break;
				case 3:
					intent = new Intent(MainActivity.this, Inaccountinfo.class);// 使用Inaccountinfo窗口初始化Intent
					startActivity(intent);// 打开Inaccountinfo
					break;
				case 4:
					intent = new Intent(MainActivity.this, Showinfo.class);// 使用Showinfo窗口初始化Intent
					startActivity(intent);// 打开Showinfo
					break;
				case 5:
					intent = new Intent(MainActivity.this, Sysset.class);// 使用Sysset窗口初始化Intent
					startActivity(intent);// 打开Sysset
					break;
				case 6:
					intent = new Intent(MainActivity.this, Accountflag.class);// 使用Accountflag窗口初始化Intent
					startActivity(intent);// 打开Accountflag
					break;
				case 7:
					intent = new Intent(MainActivity.this, Help.class);// 使用Help窗口初始化Intent
					startActivity(intent);// 打开Help
					break;
				case 8:
					finish();// 关闭当前Activity
				}
			}
		});
	}
}

class pictureAdapter extends BaseAdapter{// 创建基于BaseAdapter的子类
	private LayoutInflater inflater;// 创建LayoutInflater对象
	private List pictures;// 创建List泛型集合

	// 为类创建构造函数
	public pictureAdapter(String[] titles, int[] images, Context context) {
		super();
		pictures = new ArrayList();// 初始化泛型集合对象
		inflater = LayoutInflater.from(context);// 初始化LayoutInflater对象
		for (int i = 0; i < images.length; i++){// 遍历图像数组
			Picture picture = new Picture(titles[i], images[i]);// 使用标题和图像生成Picture对象
			pictures.add(picture);// 将Picture对象添加到泛型集合中
		}
	}

	@Override
	public int getCount() {// 获取泛型集合的长度
		if (null != pictures) {// 如果泛型集合不为空
			return pictures.size();// 返回泛型长度
		} else {
			return 0;// 返回0
		}
	}

	@Override
	public Object getItem(int arg0) {
		return pictures.get(arg0);// 获取泛型集合指定索引处的项
	}

	@Override
	public long getItemId(int arg0) {
		return arg0;// 返回泛型集合的索引
	}

	@Override
	public View getView(int arg0, View arg1, ViewGroup arg2) {
		ViewHolder viewHolder;// 创建ViewHolder对象
		if (arg1 == null){// 判断图像标识是否为空
			arg1 = inflater.inflate(R.layout.gvitem, null);// 设置图像标识
			viewHolder = new ViewHolder();// 初始化ViewHolder对象
			viewHolder.title = (TextView) arg1.findViewById(R.id.ItemTitle);// 设置图像标题
			viewHolder.image = (ImageView) arg1.findViewById(R.id.ItemImage);// 设置图像的二进制值
			arg1.setTag(viewHolder);// 设置提示
		} else {
			viewHolder = (ViewHolder) arg1.getTag();// 设置提示
		}
		viewHolder.title.setText(pictures.get(arg0).getTitle());// 设置图像标题
		viewHolder.image.setImageResource(pictures.get(arg0).getImageId());// 设置图像的二进制值
		return arg1;// 返回图像标识
	}
}

class ViewHolder{// 创建ViewHolder类
	public TextView title;// 创建TextView对象
	public ImageView image;// 创建ImageView对象
}

class Picture{// 创建Picture类
	private String title;// 定义字符串,表示图像标题
	private int imageId;// 定义int变量,表示图像的二进制值

	public Picture(){// 默认构造函数
		super();
	}

	public Picture(String title, int imageId){// 定义有参构造函数
		super();
		this.title = title;// 为图像标题赋值
		this.imageId = imageId;// 为图像的二进制值赋值
	}

	public String getTitle() {// 定义图像标题的可读属性
		return title;
	}

	public void setTitle(String title) {// 定义图像标题的可写属性
		this.title = title;
	}

	public int getImageId() {// 定义图像二进制值的可读属性
		return imageId;
	}

	public void setimageId(int imageId) {// 定义图像二进制值的可写属性
		this.imageId = imageId;
	}
}

你可能感兴趣的:(Android)