基于Android原生开发的理财小助手APP
一、實(shí)驗(yàn)題目
????個(gè)人理財(cái)小助手
二、實(shí)驗(yàn)?zāi)康?/h1>
三、總體設(shè)計(jì)
(含背景知識(shí)或基本原理與算法、或模塊介紹、設(shè)計(jì)步驟等)
3.1背景知識(shí)
???????基于android的理財(cái)小助手app,開(kāi)發(fā)采用了增量式軟件開(kāi)發(fā)模型。主要應(yīng)用了listView、button、editText、textView、spinner、dialog、CalendarView、menu等Android原生控件,以及自定義View控件ShanView(扇形圖)、CircleProgressBar(環(huán)形進(jìn)度條);采用了分層式類(lèi)似MVC的結(jié)構(gòu),分為Activity(View)、JavaBean(Model)、Service(Control),另外有Util包(工具類(lèi),包含字符串處理類(lèi)、時(shí)間格式轉(zhuǎn)換類(lèi)、數(shù)據(jù)庫(kù)操作類(lèi)等)。以達(dá)到在模塊層次上減小耦合、提高內(nèi)聚的設(shè)計(jì)目標(biāo)。
3.2 總體設(shè)計(jì)
3.3模塊介紹
3.31登錄注冊(cè)模塊
(1)登錄模塊:主要是用戶登錄功能的實(shí)現(xiàn),具有填寫(xiě)用戶名、密碼、選擇角色(用戶/管理員)的表單。還有登錄的跳轉(zhuǎn)按鈕。登錄方面,密碼填寫(xiě)為密碼框,并附帶一個(gè)圖標(biāo)按鈕(isSelected實(shí)現(xiàn))可以點(diǎn)擊實(shí)現(xiàn)顯示/隱藏密碼。非初次登錄,當(dāng)用戶填寫(xiě)完用戶名后,會(huì)自動(dòng)填寫(xiě)密碼(sharedpreferences實(shí)現(xiàn))。當(dāng)用戶名文本框焦點(diǎn)改變時(shí),上方的圓形頭像會(huì)自動(dòng)旋轉(zhuǎn)一周(animation實(shí)現(xiàn))。涉及到數(shù)據(jù)庫(kù)用戶表的查詢操作,語(yǔ)句為"select password from user where name =’" + name + “’”;頁(yè)面圖片為圖1。
(2)注冊(cè)模塊:主要是用戶注冊(cè)功能的實(shí)現(xiàn)。Ui界面用的是登錄模塊的,具有判斷用戶是否已經(jīng)被注冊(cè)的功能。用戶名和密碼不為空。涉及到數(shù)據(jù)庫(kù)用戶表的查詢插入操作。管理員方面,會(huì)自動(dòng)創(chuàng)建一個(gè)管理員賬號(hào),sql語(yǔ)句為"insert into user (name,password,role) values (‘a(chǎn)dmin’,‘a(chǎn)dmin’,‘管理員’)";頁(yè)面圖片為圖1。
3.32數(shù)據(jù)展示模塊
(1)季節(jié)收入展示模塊:利用circleprogressbar(環(huán)形進(jìn)度條)實(shí)現(xiàn)分季節(jié)統(tǒng)計(jì)收入金額。共分春夏秋冬四個(gè)季節(jié),春季(3、4、5月)、夏季(6、7、8月)、秋季(9、10、11月)、冬季(12、1、2月)。頁(yè)面圖片為圖6。
(2)季節(jié)支出展示模塊:與季節(jié)收入展示模塊類(lèi)似,利用circleprogressbar(環(huán)形進(jìn)度條)實(shí)現(xiàn)分季節(jié)統(tǒng)計(jì)收入金額。共分春夏秋冬四個(gè)季節(jié),春季(3、4、5月)、夏季(6、7、8月)、秋季(9、10、11月)、冬季(12、1、2月)。頁(yè)面圖片為5。
(3)本月收入展示模塊:獲取當(dāng)前月份,分類(lèi)(外快、兼職、工資、津貼)統(tǒng)計(jì)收入來(lái)源,使用自定義扇形圖控件shanView,涉及到數(shù)據(jù)庫(kù)的語(yǔ)句為"select sum(income.money) as money from income where name =’"+ LoginActivity.name +"’ and date like ‘%"+year+"-"+month+"-%’",思路是先分月求和查詢,然后再求季節(jié)總和。頁(yè)面圖片為圖11。
(4)本月支出展示模塊:與本月收入展示模塊類(lèi)似,獲取當(dāng)前月份,分類(lèi)(餐飲、交通、娛樂(lè)、購(gòu)物)統(tǒng)計(jì)支出方向,使用自定義扇形圖控件shanView,涉及到數(shù)據(jù)庫(kù)的語(yǔ)句為"select sum(outcome.money) as money from outcome where name =’"+ LoginActivity.name +"’ and date like’%"+year+"-"+month+"-%’",思路也是先分月求和查詢,然后再求季節(jié)總和。頁(yè)面圖片為圖11。
3.33數(shù)據(jù)管理模塊
便簽管理模塊:分兩個(gè)頁(yè)面,一個(gè)新增便簽,一個(gè)查詢便簽。其中新增便簽較為簡(jiǎn)單,查詢便簽是按照便簽內(nèi)容進(jìn)行模糊查詢。運(yùn)用數(shù)據(jù)庫(kù)查詢語(yǔ)句關(guān)鍵字like。例如select * from tips where info like ‘%今天%’;通過(guò)檢測(cè)文本框的內(nèi)容是否發(fā)生變化,如發(fā)生變化,則執(zhí)行一次模糊查詢并把結(jié)果顯示在下方的文本框中。頁(yè)面圖片為圖10和圖12。
收支管理模塊:由新增收支記錄、刪除收支記錄、統(tǒng)計(jì)收支(3.32 數(shù)據(jù)展示模塊)、查詢收支記錄組成。新增收支比較簡(jiǎn)單,查詢和刪除寫(xiě)在了一起,具體實(shí)現(xiàn)思路是查詢所有的記錄,然后用lisetview展示,利用setOnItemClickListener()監(jiān)聽(tīng)實(shí)現(xiàn)對(duì)行(記錄)的選中,然后彈出一個(gè)對(duì)話框,可以選擇是否刪除此條記錄。頁(yè)面圖片為圖3。
具體代碼如下
dialog = new AlertDialog.Builder(MyIncomeActivity.this).setTitle("系統(tǒng)提示").setMessage("是否刪除此條記錄?").setIcon(R.mipmap.ic_launcher).setPositiveButton("確定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 刪除一條記錄String sql = "delete from income where _id="+id_selected;System.out.println(sql);dbprocess2.execSql(sql); Toast.makeText(MyIncomeActivity.this,"刪除成功,請(qǐng)刷新頁(yè)面查看",Toast.LENGTH_SHORT).show();}}) .setNegativeButton("取消",null).create();數(shù)據(jù)導(dǎo)出模塊:導(dǎo)出數(shù)據(jù)為txt文件,雖然有些過(guò)時(shí),沒(méi)有采取新功能比如發(fā)郵件的形式,但是也算是做了經(jīng)典的文件存儲(chǔ)功能的實(shí)現(xiàn),鞏固了基礎(chǔ)。思路是查詢所有記錄,存入arraylist中(數(shù)組隊(duì)列),然后在文件輸出流中用getXX()方法取出來(lái),存入文件。
具體實(shí)現(xiàn)代碼如下
3.34系統(tǒng)設(shè)置模塊
系統(tǒng)設(shè)置模塊主要由修改密碼、修改壁紙組成。都比較簡(jiǎn)單,這里就不一一贅述了。長(zhǎng)話短說(shuō),修改壁紙主要是利用sharepreferences來(lái)存儲(chǔ)當(dāng)前壁紙,然后主菜單一調(diào)用onCreate()方法就會(huì)設(shè)置壁紙。
四、詳細(xì)設(shè)計(jì)(含主要的數(shù)據(jù)結(jié)構(gòu)、程序流程圖、關(guān)鍵代碼等)
4.1數(shù)據(jù)庫(kù)設(shè)計(jì)
4.11實(shí)體設(shè)計(jì):E-R圖
實(shí)體類(lèi):用戶、收入表、支出表、收支便簽
4.12Sql語(yǔ)句:
CREATE TABLE income(_id integer primary key autoincrement,name varchar(20) not null,money varchar(20) not null,date varchar(20) not null,class varchar(20) not null,payer varchar(20) not null,comment varchar(50) not null);CREATE TABLE outcome(_id integer primary key autoincrement,name varchar(20) not null,money varchar(20) not null,date varchar(20) not null,class varchar(20) not null,location varchar(20) not null,comment varchar(50) not null);CREATE TABLE tips(_id integer primary key autoincrement,name varchar(20) not null,info varchar(50) not null);CREATE TABLE user(name varchar(20) primary key not null,password varchar(20) not null,role varchar(20) not null);4.2活動(dòng)圖設(shè)計(jì)
4.3用例圖設(shè)計(jì)
4.4關(guān)鍵代碼
4.41數(shù)據(jù)庫(kù)部分:
package com.example.myapplication5.Utils; /* 本來(lái)想定義為靜態(tài)工具類(lèi)的,由于有傳入?yún)?shù)helper,故不這樣設(shè)置 */ import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast;import static java.lang.Integer.parseInt;public class dbProcess2 {// 啟動(dòng)類(lèi)private MyHelper helper;// 數(shù)據(jù)庫(kù)private SQLiteDatabase db;public dbProcess2(MyHelper helper) {this.helper = helper;}// 每次的數(shù)據(jù)庫(kù)對(duì)象要重新獲取 // 增刪改public void execSql(String sql) {// 獲取數(shù)據(jù)庫(kù)db = helper.getWritableDatabase();db.execSQL(sql);db.close();}// 查詢收支記錄public void query(String sql, TextView mTvShow, Context context) {// 獲取數(shù)據(jù)庫(kù)db = helper.getWritableDatabase();Cursor cursor = db.rawQuery(sql, null);int number = cursor.getCount();if (cursor.getCount() == 0) {mTvShow.setText("");Toast.makeText(context, "沒(méi)有數(shù)據(jù)", Toast.LENGTH_SHORT).show();} else {cursor.moveToFirst(); // 下標(biāo)從0開(kāi)始mTvShow.append("\n------------------------------");mTvShow.setText("\n" + cursor.getString(2) + "元," + cursor.getString(3) + "," + cursor.getString(4) + "," + cursor.getString(5) + "," + cursor.getString(6));mTvShow.append("\n------------------------------");}while (cursor.moveToNext()) {mTvShow.append("\n" + cursor.getString(2) + "元," + cursor.getString(3) + "," + cursor.getString(4) + "," + cursor.getString(5) + "," + cursor.getString(6) );mTvShow.append("\n------------------------------");}cursor.close();db.close();}// 查詢收支便簽public void queryTips(String sql, TextView mTvShow, Context context) {// 獲取數(shù)據(jù)庫(kù)db = helper.getWritableDatabase();Cursor cursor = db.rawQuery(sql, null);int number = cursor.getCount();System.out.println(number+"------");if (cursor.getCount() == 0) {mTvShow.setText("");System.out.println(1111);Toast.makeText(context, "沒(méi)有數(shù)據(jù)", Toast.LENGTH_SHORT).show();} else {Toast.makeText(context,"查詢到"+number+"條數(shù)據(jù)",Toast.LENGTH_SHORT).show();cursor.moveToFirst(); // 下標(biāo)從0開(kāi)始 // setText-->appendSystem.out.println(cursor.getString(0)+cursor.getString(2));mTvShow.setText(cursor.getString(0) + "," + cursor.getString(2) + ";");}while (cursor.moveToNext()) {System.out.println(cursor.getString(0)+cursor.getString(2));mTvShow.append("\n" + cursor.getString(0) + "," + cursor.getString(2) + ";");}cursor.close();db.close();}// 根據(jù)用戶名查詢密碼或權(quán)限public String queryOne(String sql) {// 獲取數(shù)據(jù)庫(kù)db = helper.getWritableDatabase();Cursor cursor = db.rawQuery(sql, null);if (cursor.getCount() == 0) {return "用戶不存在";} else {cursor.moveToFirst();/* 這里index為何是0 解答:因?yàn)檫@里獲取的是單個(gè)列---select password/role */return cursor.getString(0);}}// 根據(jù)用戶名查詢收入/支出表 根據(jù)月份查詢收支表public int queryMoney(String sql) {int count = 0;// 獲取數(shù)據(jù)庫(kù)db = helper.getWritableDatabase();Cursor cursor = db.rawQuery(sql, null);System.out.println("查詢到的記錄條數(shù)"+cursor.getCount());if (cursor.getCount() == 0) {return 0;} else {cursor.moveToFirst();String num = cursor.getString(0);if (StringUtils.isBlank(num)){ // 這里需要加個(gè)判斷是否為空,為啥總會(huì)查到一條記錄 ???return 0;}count = parseInt(num);System.out.println("-----" + num + "-----");}cursor.close();db.close();return count;}}4.5 運(yùn)行效果截圖
圖1 登錄注冊(cè)
圖2 后臺(tái)管理頁(yè)
圖3 我的收入頁(yè)
圖4 數(shù)據(jù)管理頁(yè)
圖5-6 數(shù)據(jù)可視化頁(yè)面
圖7 主菜單界面
圖8 新增收入頁(yè)
圖9 系統(tǒng)設(shè)置頁(yè)
圖10 新增便簽頁(yè)
圖11 本月收入/支出
圖12 查詢便簽
五、實(shí)驗(yàn)結(jié)果與分析
???????本次課程設(shè)計(jì)實(shí)現(xiàn)了登錄注冊(cè)、新增收入、新增支出、查詢所有收入、查詢所有支出、按id刪除收入記錄、按id刪除支出記錄、統(tǒng)計(jì)當(dāng)年季節(jié)收入金額及比例并展示、統(tǒng)計(jì)當(dāng)年季節(jié)支出金額及比例并展示、統(tǒng)計(jì)當(dāng)月收入來(lái)源、統(tǒng)計(jì)當(dāng)月支出去向(扇形圖)、更換壁紙、更改密碼、數(shù)據(jù)導(dǎo)出(txt文件)新增收支便簽、查詢收支便簽(按內(nèi)容進(jìn)行模糊查詢like)等功能。總體上達(dá)到了指導(dǎo)書(shū)上的設(shè)計(jì)要求。并有些許創(chuàng)新,比如在控件的使用上選擇了更多沒(méi)接觸過(guò)的控件,如在收支記錄的時(shí)間選擇上使用了CalendarView、在收支類(lèi)別上選擇了Spinner、在數(shù)據(jù)管理頁(yè)功能選擇上使用了menu、在季節(jié)收支比例上使用了自定義環(huán)形進(jìn)度條,并加入了動(dòng)態(tài)繪圖功能,豐富了用戶體驗(yàn)。還有學(xué)習(xí)借鑒了csdn上大佬的自定義扇形圖控件。
六、小結(jié)與心得體會(huì)
???????本次課程設(shè)計(jì)歷時(shí)兩周,感受頗多,收獲頗多。可以算是自己獨(dú)立設(shè)計(jì)的比較成熟的第一個(gè)項(xiàng)目吧,應(yīng)用了數(shù)據(jù)庫(kù)技術(shù)、mvc架構(gòu)思想、分層分級(jí)思想、android界面設(shè)計(jì)、組件設(shè)計(jì)。這個(gè)項(xiàng)目代碼量比較大,有三十多個(gè)類(lèi),所以代碼冗余也是一大缺點(diǎn),有些功能函數(shù)其實(shí)可以分離出去單獨(dú)成一個(gè)類(lèi),但是分離之后的接口設(shè)計(jì)層次我又有點(diǎn)不知所措。比如自己封裝好的數(shù)據(jù)庫(kù)操作類(lèi)dbprocess2.class,在增刪改查上實(shí)現(xiàn)了通用的功能,但是在某些頁(yè)面上查詢展示需要個(gè)性化需求,又不得不重寫(xiě)一個(gè)類(lèi)似的方法,不然為了通用又得改原方法。這個(gè)涉及到個(gè)人在內(nèi)聚耦合的選擇。我盡量去做到“低耦合,高內(nèi)聚”
???????代碼設(shè)計(jì)中我盡量秉持著規(guī)范化原則,每個(gè)模塊都寫(xiě)了注釋,不僅方便別人看懂,也能然自己思路清晰,方便查找修改bug。在設(shè)計(jì)中我也使用了測(cè)試類(lèi)junit,這樣尤其對(duì)于android這樣需要頁(yè)面驅(qū)動(dòng)的方法調(diào)用比較好單獨(dú)測(cè)試一個(gè)模塊一個(gè)函數(shù)的功能,經(jīng)測(cè)試后再加入原程序。
???????在題目選擇方面,相比ui設(shè)計(jì),我更注重業(yè)務(wù)邏輯,所以選擇了界面較為簡(jiǎn)單的理財(cái)小助手。其他題目的ui設(shè)計(jì)較為復(fù)雜,再去開(kāi)發(fā)完整會(huì)比較耗時(shí)。但也會(huì)適當(dāng)加入美化頁(yè)面的新控件,以使自己在熟練掌握已學(xué)知識(shí)的基礎(chǔ)上進(jìn)行拓展。立足基礎(chǔ),增量式設(shè)計(jì)。
???????本次課程設(shè)計(jì)由自己獨(dú)立完成,做出成品的那一刻覺(jué)得所有辛苦都值得了,滿滿的成就感,每個(gè)作品就像自己的孩子一樣,都記錄著自己成長(zhǎng)的足跡。
???????也感謝老師在最后的驗(yàn)收環(huán)節(jié)給予我的意見(jiàn)和建議以及肯定,我會(huì)盡量去改正。比如流程圖的設(shè)計(jì)上我會(huì)更加規(guī)范化,采用工程化的uml設(shè)計(jì),規(guī)范自己。盡量養(yǎng)成好的習(xí)慣,這次課程設(shè)計(jì)的過(guò)程中我做了大量的記錄工作,每天都有簡(jiǎn)潔的寫(xiě)日志和總結(jié)自己遇到的問(wèn)題,然后多思考大體確定第二天的設(shè)計(jì)目標(biāo),要加哪些模塊等等。在這樣也使我目標(biāo)明確,有方向感。在敲代碼的過(guò)程中,并不顯得輕松,但我還算比較有韌性,遇到難題不輕易放棄,盡量去學(xué)習(xí)別人的經(jīng)驗(yàn),搜索了大量的博客,有些人寫(xiě)的比較好我采納了。這樣才使得最后能夠做出來(lái)。
總結(jié)
以上是生活随笔為你收集整理的基于Android原生开发的理财小助手APP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 估值报告写作第一讲——第五届CVA估值建
- 下一篇: 教你如何加入一家好的广告联盟——如微博0