0

Есть простая БД, состоящая из одной таблицы в которой 2 колонки (_id, name);

В данный момент разбираюсь с удалением элементов ListView и удалением необходимой строчки в БД. Сама строчка из ListView удаляется, не могу пока понять как грамотно еще и из БД удалять то, что выбрал. Помогите пжлст.

public class MainActivity extends Activity {
    private static final String DATABASE_NAME = "myDatabase.db";
    private static final String DATABASE_TABLE = "mainTable";
    private static final String COLUMN_NAME = "name";
    private static final String COLUMN_ID = "_id";

    private static final String DATABASE_CREATE = "create table if not exists "
            + DATABASE_TABLE + " (_id integer primary key autoincrement,"
            + COLUMN_NAME + " text not null);";

    private static final int CM_DELETE_ID = 1;

    SQLiteDatabase myDatabase;

    ListView lv;
    SimpleAdapter sAdapter;
    ArrayList<Map<String, String>> data;
    Map<String, String> m;
    Cursor c;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        myDatabase = openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null);
        myDatabase.execSQL(DATABASE_CREATE);

        // упаковываем данные в понятную для адаптера структуру
        data = new ArrayList<Map<String, String>>();
        c = myDatabase.query(DATABASE_TABLE, new String[] { COLUMN_ID, COLUMN_NAME }, null, null, null, null, null);

                //считываем данные с БД и заносим их в data
        if (c.moveToFirst()) {
            do {
            m = new HashMap<String, String>();
            m.put(COLUMN_ID , String.valueOf(c.getInt(0)));
            m.put(COLUMN_NAME, c.getString(1));

            data.add(m);
            } while (c.moveToNext());
        }

        // массив имен атрибутов, из которых будут читаться данные
        String[] from = { COLUMN_NAME };
        // массив ID View-компонентов, в которые будут вставлять данные
        int[] to = { R.id.tvText};

        // создаем адаптер
        sAdapter = new SimpleAdapter(this, data, R.layout.item, from, to);

        // определяем список и присваиваем ему адаптер
        lv = (ListView) findViewById(R.id.lvSimple);
        lv.setAdapter(sAdapter);
        registerForContextMenu(lv);

        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                    int position, long id) {

                CharSequence text = ((TextView) v).getText();

                int duration = Toast.LENGTH_LONG;
                Context context = getApplicationContext();

                                **//КАК ПРАВИЛЬНО ВЫВЕСТИ id из БД?** (тут чушь)
                String where = " name = " + "'" + text + "'";

                c = myDatabase.query(true, DATABASE_TABLE,
                new String[] { "_id" }, where, null, null, null, null,
                        null);
                c.moveToFirst();

                CharSequence columnValue = String.valueOf(c.getInt(0));

                Toast.makeText(context, columnValue, duration).show();
            }
        });
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenu.ContextMenuInfo menuInfo) {

        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, CM_DELETE_ID, 0, "Удалить запись");
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        if (item.getItemId() == CM_DELETE_ID) {
            // получаем инфу о пункте списка
            AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
                    .getMenuInfo();

            // удаляем Map из коллекции, используя позицию пункта в списке
               data.remove(acmi.position);
            // уведомляем, что данные изменились
               sAdapter.notifyDataSetChanged();

                           myDatabase.delete(DATABASE_TABLE, COLUMN_ID + " = " **ЧТО  СЮДА ВПИСАТЬ???**,  null);

            return true;
        }
        return super.onContextItemSelected(item);
    }
}

1 ответ 1

1

Разобрался. Сначала думал запоминать _id в tag пункта списка и по нему удалять записи. Но есть более простой вариант, использовать SimpleCursorAdapter и не заморачиваться с запоминанием _id.

@Override
public boolean onContextItemSelected(MenuItem item) {
    if (item.getItemId() == CM_DELETE_ID) {
        // получаем инфу о пункте списка
        AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
                .getMenuInfo();

           myDatabase.delete(DATABASE_TABLE, COLUMN_ID + " = " + acmi.id, null);
           cursor.requery();
        return true;
    }
    return super.onContextItemSelected(item);
}

Удаляется как item, так и запись из БД.

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.