Использование контекстного меню для удаления из базы данных SQLite в Android - PullRequest
1 голос
/ 26 марта 2010

Я создал представление списка, в котором отображаются имена и даты элементов, хранящихся в базе данных SQLite, теперь я хочу использовать контекстное меню для изменения этих элементов, хранящихся в базе данных, таких как редактирование имени, удаление и просмотр.

Это код для представления списка:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listview);

    SQLiteDatabase myDB = null; 
    myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);

    Cursor cur = myDB.rawQuery("SELECT _id, trackname, tracktime" + " FROM " + MY_DB_TABLE, null);
    ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.listview, cur,
    new String[] { Constants.TRACK_NAME, Constants.TRACK_TIME}, new int[] { R.id.text1, R.id.text2});
    ListView list = (ListView)findViewById(R.id.list);
    list.setAdapter(adapter);
    registerForContextMenu(list);
}

и контекстное меню ...

public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle("Track Options");
    menu.add(0, CHANGE_NAME, 0, "Change name");

    menu.add(0, VIEW_TRACK, 0, "View track");

    menu.add(0, SEND_TRACK, 0, "Send track");

    menu.add(0, DELETE_TRACK, 0, "Delete track");


}

Я использовал оператор Switch для управления пунктами меню ..

public boolean onContextItemSelected(MenuItem item) {
   switch (item.getItemId()){
   case CHANGE_NAME:
       changename();
       return true;

   case DELETE_TRACK:
       deletetrack();
       return true;

   default:
   return super.onContextItemSelected(item);
}

Так, как бы я пошел дальше и отобразил deletetrack (); способ найти идентификатор трека, сохраненного в базе данных, для элемента, который был выбран в представлении списка?

Ответы [ 3 ]

3 голосов
/ 26 марта 2010

в вашем onContextItemSelected(), сделайте что-то вроде этого:

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = 
        (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();

            Track track = (Track)mAdapter.getItem(info.position);

Ключ «позиция», который даст вам индекс выбранного элемента.

1 голос
/ 17 июня 2015

Я попробовал этот метод и многие другие, но ни один не работал для меня. Вот как я наконец заработал:

1. Я создал метод в своем классе обработчика базы данных (ваш класс, который расширяет SQLiteOpenHelper), который извлекает все идентификаторы в моей базе данных:

public ArrayList<HashMap<String, String>> selectAllIds() {
    try {
        ArrayList<HashMap<String, String>> idArrayList = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> map;

        SQLiteDatabase database = this.getReadableDatabase();

        String query = "SELECT * FROM " + DEBTS_TABLE_NAME;

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

        if (cursor != null) {
            if (cursor.moveToFirst()) {
                do {
                    map = new HashMap<String, String>();
                    map.put("id", cursor.getString(0));
                    idArrayList.add(map);

                } while (cursor.moveToNext());
            }
        }
        if (cursor != null) {
            cursor.close();
        }
        database.close();
        return idArrayList;


    } catch (Exception e) {
        return null;
    }

}

2. В классе или фрагменте, который имеет метод onContextItemSelected, объявите это:

 ArrayList<HashMap<String, String>> myIds;

3. Тогда по моему onContextItemSelected методу:

public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info =

 (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

    myIds = debtDatabaseHandler.selectAllIds();
    int id = Integer.parseInt(myIds.get(info.position).get("id"));

идентификатор в моей базе данных имеет тип Integer, поэтому мне пришлось его проанализировать. Если ваш идентификатор является строкой, просто выполните:

String id = myIds.get(info.position).get("id");

4. Наконец, передайте этот идентификатор вызову для удаления строки в базе данных:

yourDatabase.deleteMethod(id);

Идея кредита: Android Удалить данные строк в базе данных SQLite (Android SQLite)

0 голосов
/ 16 апреля 2012

Я не могу добавить комментарий к ответу @synic, но он полностью мне подходит. Код ниже может получить элемент Listview:

AdapterView.AdapterContextMenuInfo info = 
            (AdapterView.AdapterContextMenuInfo)aItem.getMenuInfo();

Затем вы можете делать с элементом все, что хотите, например, getId (), getName (), getDate () или что-то еще Желаю вам радости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...