2011年8月27日 星期六

【Android】TQC+題組系列2(四)


這題乍看之下真的讓人覺得一定做不完,其實因為有超過一半的東西都是預先設定好的,所以只要記得那些地方要額外設定,其實還蠻簡單的。

先看主程式,首先是 Menu 要自訂項目,重點在 itemId 要配合常數列舉去設定
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    // ---MENU_ADD等為專案預設常數
    menu.add(0, MENU_ADD, 0, R.string.strAddButton);
    menu.add(0, MENU_EDIT, 1, R.string.strEditButton);
    menu.add(0, MENU_DELETE, 2, R.string.strDeleteButton);
    return true;
}

然後 list 的onClick已經有放click的時候該做什麼,onItemSelected只要照抄就好
public void onItemSelected(AdapterView arg0, View arg1, int arg2, long arg3) {
    // ---依position移動cursor以取得_id
    myCursor.moveToPosition(arg2);
    _id = myCursor.getInt(0);
    myEditText.setText(myCursor.getString(1));
}

然後是CUD的組合,也是我們主程式中最主要要寫的部分,reloadListView是做完動作後重新binding清單用的自訂method。
private void addTodo() {
    gaaSQLiteOpenHelper.insert(myEditText.getText().toString());
    reloadListView();
}

private void editTodo() {
    gaaSQLiteOpenHelper.update(_id, myEditText.getText().toString());
    reloadListView();
}

private void deleteTodo() {
    gaaSQLiteOpenHelper.delete(_id);
    reloadListView();
}
    
//---自訂方法,重新query取得新的cursor後,重新binding ListView。
private void reloadListView(){
    myCursor.requery();
    myListView.invalidateViews();
    myEditText.setText("");
    _id = 0;
}

然後是副程式,SQLiteOpenHelper這個類別,建構跟 select 都已經預先寫好了,我們要改的還是在 CUD 的部分

public long insert(String text) {
    SQLiteDatabase db = this.getWritableDatabase();
    //---ContentValues是SQLite用的值集合
    ContentValues values=new ContentValues();  
    values.put(FIELD_TEXT, text);  
    return db.insert(TABLE_NAME, null, values);
}

public void delete(int id) {
    SQLiteDatabase db = this.getWritableDatabase();
    String where = FIELD_id + " = ?";
    String[] whereValue = { Integer.toString(id) };
    //---Where已經設定好了,只要填入使用即可。
    db.delete(TABLE_NAME, where, whereValue);
}

public void update(int id, String text) {
    SQLiteDatabase db = this.getWritableDatabase();
    String where = FIELD_id + " = ?";
    String[] whereValue = { Integer.toString(id) };
    //---update要結合Where跟值集合
    ContentValues values=new ContentValues();  
    values.put(FIELD_TEXT, text);  
    db.update(TABLE_NAME, values, where, whereValue);
}

這次卡最久的部分是打錯字... getText 打成 getTag 造成 NullException 然後在那裏想半天,搞不懂哪裡造成的 Null值。

沒有留言:

張貼留言