2013-02-08 5 views
1

Могу ли я попросить о помощи ... мне удается добавить данные в базу данных .. но у меня проблема с удалением данных ... потому что я не могу удалить на основе ID из моего ListView. .Как получить идентификатор ?? .. это мой код ..удалить запись базы данных в ListActivity android

Это имя класса, как ViewActivity.java где я показывать мое содержание базы данных ... я отображать только один столбец только в моем ListView

String query = "select * from " + helper.TABLE_PEKERJA; 

     Cursor c = database.rawQuery(query, null); 

     if(c!=null) 
     { 
      c.moveToFirst(); 
      int getNamaIndex = c.getColumnIndex(helper.COL_NAMA); 

      if(c.isFirst()) 
      { 
       do{ 
        String nama = c.getString(getNamaIndex); 
        result.add(nama); 
       }while(c.moveToNext()); 
      } 
     } 

     this.setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1,result)); 
     getListView().setTextFilterEnabled(true); 

в моем DBHelper, я создаю метод для удаления строки из таблицы моей базы данных, которая находится здесь.

public void deleteData(SQLiteDatabase db, String id) 
{ 
    db.delete(TABLE_PEKERJA, COL_ID + " = " +id, null); 
} 

тогда еще в классе ViewActivity.java, я реализовать метод onListItemClick

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    DBHelper helper = new DBHelper(this); 
    database = helper.getWritableDatabase();   

    Object o = this.getListAdapter().getItem(position); 
    String keyword = o.toString(); 
    helper.deleteData(database, keyword); 
    Toast.makeText(this, "Data " + keyword + " removed" , Toast.LENGTH_SHORT).show(); 

} 

также получил это error..this ошибка только я могу смотреть ... эта ошибка в части

Object o = this.getListAdapter().getItem(position); 

02-09 02:34:23.729: E/Database(28923): at com.example.untukmuna.ViewContentActivity.onListItemClick(ViewContentActivity.java:69) 

Так , мой вопрос:

1) Как удалить строку таблицы базы данных, когда я нажимаю элемент в ListView на основе ID 2) при создании базы данных есть db.open() ... но где я должен закрыть загрузка базы данных db.close() ... ??

thanksss ~~ надеюсь, что вы все поняли мой вопрос ..^_^

ответ

0

так, что обычно делается в том, что вы просто получаете id из параметра списка клик.

protected void onListItemClick(ListView l, View v, int position, long id) <------ 

Но вы не можете сразу сделать это, потому что ваш ListView подключен к ArrayAdapter и не CursorAdapter. Прямо сейчас, что id будет либо всегда быть 0, либо некорректным значением. Я бы рекомендовал вам изменить свои адаптеры, если вам нужно выполнять такие задачи.

Но если вам нужны ваши адаптеры как есть, то что вы можете сделать, это сделать соответствующую коллекцию id, которую вы заполняете, когда вы заполняете свою базу данных, чтобы заполнить result. Тогда было бы так же просто, как получить position из параметра onListItemClick, а затем получить id из коллекции идентификаторов.

вы, конечно же, должны удостовериться, что вы удаляете значение этой коллекции, когда вы удаляете строку списка.


попробуйте следующее:

private DBHelper helper; 
private SQLiteDatabase db; 
private ArrayList<String> result = new ArrayList<String>(); 
private ArrayList<Long> idList = new ArrayList<Long>(); 
private ArrayAdapter<String> adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    helper = new DBHelper(this); 
    db = helper.getWritableDatabase();  

    String query = "select * from " + helper.TABLE_PEKERJA; 
    Cursor c = db.rawQuery(query, null); 
    int getIdIndex = c.getColumnIndex(helper.COL_ID); 
    int getNamaIndex = c.getColumnIndex(helper.COL_NAMA); 

    while (c.moveToNext()) { 
     idList.add(c.getLong(getIdIndex)); 
     result.add(c.getString(getNamaIndex)); 
    } 

    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, result); 
    this.setListAdapter(adapter); 
    getListView().setTextFilterEnabled(true); 
} 

public boolean deleteData(Long id) { 
    return db.delete(TABLE_PEKERJA, COL_ID + " = " + id, null) > 0; 
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    Long idValue = idList.get(position); 
    boolean isDeleted = deleteData(idValue); 
    Toast.makeText(this, "boolean value for database deletion: " + String.valueOf(isDeleted), Toast.LENGTH_SHORT).show(); 

    idList.remove(position); 
    result.remove(position); 
    adapter.notifyDataSetChanged(); //refresh so that we can see listview changes 
} 
+0

спасибо за вас код ... я использую вам код, но я не копировать all..just принять участие onListItemClick..but, когда я бегу, его показывает ошибку..который говорит indexoutofbound ... я отредактирую и скопирую результат для вас при моем ответе ниже. – iWantToLearn

+0

вы получаете ошибку, потому что пытаетесь получить что-то из коллекции, которая не была заполнена все же. 'idList.add (c.getLong (getIdIndex));' является критическим. которые нельзя опустить. – mango

+0

yeaaahhh .. !!! ... это работаетsss ..... так много много много спасибо за вас @mango .... – iWantToLearn

Смежные вопросы