上篇讓這個App似乎變得有趣一點了?!

故此篇將敘述最後一個功能 ── 檢閱紀錄(Database)。

在做紀錄前要先知道自己想記些什麼東西:BMI結果、BMI數值、計算的時間、身高與體重,嗯...就這五項。

於是新建一個LogActivity,並只放入ListView在xml,然後新建一個item_layout.xml,開始構築要呈現的環境。

雖然記錄了五樣項目,但這五樣都呈現的話會造成UI觀感上太雜亂,所以我只挑BMI結果、BMI數值、計算的時間這三樣呈現,故UI的呈現如下。

bmi_calculator_0010.png  

再來,新增一個類別名為DBAdapter,開始架構資料庫。

因為要儲存上述五樣資料,所以在資料庫中要給予相對應的值與欄位,因為要保留流水號的關係,所以一共是六筆。

public static final String KEY_ROWID = "_id";
public static final String KEY_DATE = "date";
public static final String KEY_HEIGHT = "height";
public static final String KEY_WEIGHT = "weight";
public static final String KEY_BMI = "bmi";
public static final String KEY_DESCRIPTION = "description";
public static final int COL_ROWID = 0;
public static final int COL_DATE = 1;
public static final int COL_HEIGHT = 2;
public static final int COL_WEIGHT = 3;
public static final int COL_BMI = 4;
public static final int COL_DESCRIPTION = 5;

DB與Table的名字自然也是不可少的。

public static final String DATABASE_NAME = "MyDb";
public static final String DATABASE_TABLE = "mainTable";

考慮到日後有可能會做版本更新,其資料庫版號順便給一下。

public static final int DATABASE_VERSION = 1;

建立Table時,不允許欄位為空值。

private static final String DATABASE_CREATE_SQL =
"create table " + DATABASE_TABLE
+ " (" + KEY_ROWID + " integer primary key autoincrement, "
+ KEY_DATE + " string not null, "
+ KEY_HEIGHT + " string not null, "
+ KEY_WEIGHT + " string not null, "
+ KEY_BMI + " string not null, "
+ KEY_DESCRIPTION + " string not null"
+ ");";

新增資料。

public long insertRow(String date, String height, String weight, String bmi, String description) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_DATE, date);
initialValues.put(KEY_HEIGHT, height);
initialValues.put(KEY_WEIGHT, weight);
initialValues.put(KEY_BMI, bmi);
initialValues.put(KEY_DESCRIPTION, description);
return db.insert(DATABASE_TABLE, null, initialValues);
}

更新資料。

public boolean updateRow(long rowId, String date, String height, String weight, String bmi, String description) {
String where = KEY_ROWID + "=" + rowId;
ContentValues newValues = new ContentValues();
newValues.put(KEY_DATE, date);
newValues.put(KEY_HEIGHT, height);
newValues.put(KEY_WEIGHT, weight);
newValues.put(KEY_BMI, bmi);
newValues.put(KEY_DESCRIPTION, description);
return db.update(DATABASE_TABLE, newValues, where, null) != 0;
}

若不使用DB則要將其關閉。

public void close() {
myDBHelper.close();
}

架構出一個簡易的DB後,回到LogActivity進行資料顯示:

private void populateListViewFromDB() {
Cursor cursor = myDb.getAllRows();
startManagingCursor(cursor);
String[] fromFieldNames = new String[] {DBAdapter.KEY_DESCRIPTION, DBAdapter.KEY_BMI, DBAdapter.KEY_DATE};
int[] toViewIDs = new int[] {R.id.item_results, R.id.item_bmi, R.id.item_date};
SimpleCursorAdapter myCursorAdapter =
new SimpleCursorAdapter(
this,
R.layout.item_layout,
cursor,
fromFieldNames,
toViewIDs
);
ListView myList = (ListView) findViewById(R.id.listViewFromDB);
myList.setAdapter(myCursorAdapter);
}

以及點擊list後要產生一個Toast顯示所有資料:

private void displayToastForId(long idInDB) {
Cursor cursor = myDb.getRow(idInDB);
if (cursor.moveToFirst()) {
long idDB = cursor.getLong(DBAdapter.COL_ROWID);
String date = cursor.getString(DBAdapter.COL_DATE);
String height = cursor.getString(DBAdapter.COL_HEIGHT);
String weight = cursor.getString(DBAdapter.COL_WEIGHT);
String bmi = cursor.getString(DBAdapter.COL_BMI);
String description = cursor.getString(DBAdapter.COL_DESCRIPTION);
String message = "DATE: " + date + "\n"
+ "Height: " + height + "\n"
+ "Weight: " + weight + "\n"
+ "BMI value: " + bmi + "\n"
+ "BMI results: " + description;
Toast.makeText(LogActivity.this, message, Toast.LENGTH_LONG).show();

}
cursor.close();
}

至此,大致上告一段落,來到MainActivity,進行資料新增,方法很簡單,只要在得到計算結果後插入資料就可以了。

myDb.insertRow(logDate, String.valueOf(value1), String.valueOf(value2), String.valueOf(bdResults), bmiDescription);

參數一是日期與時間,參數二是使用者的身高,參數三是使用者的體重,參數四是計算後的數值,最後是轉盤顯示的結果。

整體而言,有記錄的畫面是這樣:

bmi_calculator_0009.png  

那麼,目前版本的code可以到這裡進行下載,hmm...都做到這樣了,實在是很想再多加幾個功能上去,例如把結果用折線圖來表示、或是歷史紀錄可以照時間順序排等功能。

程式這種東西通常在寫時才會發現,因需求一直增加,故其架構會比當初想的來得大。

而且當寫完時總會有種還可以更好、更完善的感覺。

所以這篇也不見得是最後一篇啦,只是下次更新不知道是什麼時候而已。

此外,程式內用了許多很笨的方法,此舉只是希望能讓不熟的人也能瞭解其目的,若能引起討論那真是再好不過。

,

scarletdream 發表在 痞客邦 PIXNET 留言(0) 人氣()