一、團隊成員:java
李凌龍 161 學號:1600802015 博客:http://www.cnblogs.com/Trip1eL/git
李 成 161 學號:1600802013 博客:http://www.cnblogs.com/lckzy/ 數據庫
趙澤泓 162 學號:1600802070 博客:http://www.cnblogs.com/magicm37/網絡
二、APK 連接: 數據庫設計
https://coding.net/u/Trip1eL/p/EasyCashBook/git/raw/master/EasyCashBook.apkide
三、做業代碼連接:佈局
https://coding.net/u/Trip1eL/p/EasyCashBook/git優化
四、介紹團隊項目this
演示視頻:https://coding.net/u/Trip1eL/p/EasyCashBook/git/raw/master/SVID_20190104_104434_1.mp4spa
4.1 團隊項目的整體效果截圖
4.2 實現的功能及其效果的描述
4.2.1新建某日消費記錄並插入多條信息
4.2.2保存在本地SQLite數據庫 經過ListView展現在主界面
4.2.3對已記帳目進行修改
4.2.4設置記帳日期
五、項目關鍵代碼
5.1建立數據庫
public class CashBookDataBase extends SQLiteOpenHelper { private static final String CREATE_TABLE_CASHBOOK = "create table cashbook (" + "id integer primary key autoincrement," + "date integer," + "name text," + "price text)"; public CashBookDataBase(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { sqLiteDatabase.execSQL(CREATE_TABLE_CASHBOOK); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } public void insertData(long date, String name, String price) { SQLiteDatabase db = getWritableDatabase(); db.execSQL("insert into cashbook (date, name, price) values (?, ?, ?)", new Object[]{date, name, price}); } public Cursor getDateData() { SQLiteDatabase db = getReadableDatabase(); return db.rawQuery("select date from cashbook group by date", null); } public Cursor getAllDataByDate(long Date) { SQLiteDatabase db = getReadableDatabase(); return db.rawQuery("select * from cashbook where date = ? order by date asc", new String[]{String.valueOf(Date)}); } public Cursor getData(long date) { SQLiteDatabase db = getReadableDatabase(); return db.rawQuery("select * from cashbook where date >= ? order by date asc", new String[]{String.valueOf(date)}); } public void deleteData(long date) { SQLiteDatabase db = getWritableDatabase(); db.execSQL("delete from cashbook where date = ?", new String[]{String.valueOf(date)}); } }
5.2 Listview(實現顯示和編輯功能前提)
public CashBookListView(Context context, AttributeSet attrs) { super(context, attrs); mGestureDetector = new GestureDetector(getContext(), this); setOnTouchListener(this); } @Override public boolean onDown(MotionEvent motionEvent) { if (!bIsDeleteBtnShow) { mItemPosition = pointToPosition((int)motionEvent.getX(), (int)motionEvent.getY()); } return false; } @Override public void onShowPress(MotionEvent motionEvent) { } @Override public boolean onSingleTapUp(MotionEvent motionEvent) { return false; } @Override public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { return false; } @Override public void onLongPress(MotionEvent motionEvent) { } @Override public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { if (!bIsDeleteBtnShow && Math.abs(v) > Math.abs(v1)) { mBtnView = LayoutInflater.from(getContext()).inflate(R.layout.layout, null); mBtnView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { mItemLayout.removeView(mBtnView); mBtnView = null; bIsDeleteBtnShow = false; } }); mItemLayout = (ViewGroup) getChildAt(mItemPosition - getFirstVisiblePosition()); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); layoutParams.addRule(RelativeLayout.CENTER_VERTICAL); mItemLayout.addView(mBtnView, layoutParams); bIsDeleteBtnShow = true; } return false; } @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (bIsDeleteBtnShow) { mItemLayout.removeView(mBtnView); bIsDeleteBtnShow = false; mBtnView = null; return false; } else { return mGestureDetector.onTouchEvent(motionEvent); } } }
5.3
protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == 0 && data != null) { List<String> name = (List<String>) data.getSerializableExtra("name"); List<String> price = (List<String>) data.getSerializableExtra("price"); long date; int numName = name.size(); int numPrice = price.size(); long date_tmp = data.getLongExtra("date", -1); if (date_tmp != -1) { date = date_tmp; mDataBaseHelper.deleteData(date); } else { date = System.currentTimeMillis(); } int i, j; i = (numName >= numPrice ? numName : numPrice); for (j = 0; j < i; j++) { mDataBaseHelper.insertData(date, name.get(j), price.get(j)); } updateDataFromDB(); } }
六、項目對比
一、李怡龍小組:這個項目就是存儲用戶信息的一個項目,經過用戶的註冊,來存儲用戶的信息,優勢就是簡單明瞭實用性強,功能實現完整且精確,存在缺點有時會跳BUG。
2、韓璐組音樂播放器:實現了音樂播放器的基本功能,但存在界面優化不足的缺點,對模擬器要求較高。
3、周麗麗組音樂播放器:一樣實現了音樂播放器的基本功能,功能實現完整但界面不夠美觀,優化不夠。對高版本API有閃退的現象。
4、毛建小組:所作的校園頭條,實現了查看新聞,用列表展現新聞的功能採用了兩個界面,但界面佈局感受有些怪異,沒有實現實時更新新聞的功能,相關的功能塊也不能跳轉。
5、馬進財小組:界面基本實現,但點功能塊時會出現閃退現象。
七、問題及解決方法
7.1數據庫沒法更新數據:1600802015李凌龍
起初設計完成後沒有在MainActivity.java中的onCreat方法中啓動數據庫致使一直沒法開啓App啓動數據庫 後續在代碼中添加代碼後解決
mDataBaseHelper = ((CashBookApplication)getApplication()).getDataBaseHelper();
updateDataFromDB();
7.2ListView顯示帳目問題:1600802015李凌龍
查閱網絡資料 理解了ListView工做原理最後解決以下
public View getView(int position, View convertView, ViewGroup parent) { CashBook cashBook = getItem(position); View view; ViewHolder viewHolder; if (convertView == null) { view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false); viewHolder = new ViewHolder(); viewHolder.date = (TextView) view.findViewById(R.id.txt_date); viewHolder.content = (TextView) view.findViewById(R.id.txt_content); view.setTag(viewHolder); } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); } viewHolder.date.setText(StampToDate.StampConvertToDate(cashBook.getDate())); viewHolder.content.setText(cashBook.getContent()); return view; } class ViewHolder { TextView date; TextView content; }
7.3 如何實現日期:1600802013李成
初期是打算設計爲手動輸入日期,後來查閱Google官方資料 官方有相關組件 因而最終選擇直接利用組件
switch (view.getId()) { case R.id.btn_datepicker: DatePickerDialog dialog = new DatePickerDialog(AddCashBookActivity.this, 0, dateSetListener, Calendar.getInstance().get(Calendar.YEAR), Calendar.getInstance().get(Calendar.MONTH), Calendar.getInstance().get(Calendar.DAY_OF_MONTH)); dialog.show(); break; default: break; }
7.4 如何插入多條數據:1600802013李成
在建立時把數據放在同一行 顯示時用逗號分開
7.5 編輯數據:趙澤泓 1600802070
點擊ListView中顯示的數據 將數據所在的數據打開在建立的頁面裏 進行編輯 從新寫入數據庫
7.6 建立功能:趙澤泓 1600802070
起初沒法直接寫入數據庫 最後經過在DBHelper中修改insertData方法直接把數據插入數據庫
public void insertData(long date, String name, String price) { SQLiteDatabase db = getWritableDatabase(); db.execSQL("insert into cashbook (date, name, price) values (?, ?, ?)", new Object[]{date, name, price}); }
8分工安排
姓名 | 分工 | 工做比例 | 分數 |
李凌龍 | 數據庫設計、UI設計 | 34% | 10 |
李成 | 數據功能、按鍵功能 | 33% | 10 |
趙澤泓 | 編輯,建立功能實現 | 33% | 10 |