Как удалить элемент из базы данных ListView и SQLite? - PullRequest
0 голосов
/ 08 ноября 2018

Я использую AbsListView.MultiChoiceModeListener, чтобы выбрать один или любой элементы и удалить из ListView (список) и базы данных SQLite. ListView есть заполняется данными из другой деятельности, как правило. По коду, как показано ниже метод onActionItemClicked(ActionMode mode, MenuItem item) только удаляет последний пункт из списка. Как выбрать и удалить элементы из списка и База данных SQLite и список обновлений в этом упражнении?

DatabaseHelper.class

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String TABLE_NAME = "value_table";
    private static final String COL1 = "ID";
    private static final String COL2 = "name";

    public DatabaseHelper(Context context/*, String name, SQLiteDatabase.CursorFactory factory, int version*/) {
        super(context, TABLE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COL2 +" TEXT)";
        db.execSQL(createTable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME);
        onCreate(db);
    }
    public boolean addData(String item) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL2, item);

        long result = db.insert(TABLE_NAME, null, contentValues);

        //if date as inserted incorrectly it will return -1
        if (result == -1) {
            return false;
        } else {
            return true;
        }
    }
    public Cursor getData(){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_NAME;
        Cursor data = db.rawQuery(query, null);
        return data;
    }
    public Cursor getItemID(String name){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT " + COL1 + " FROM " + TABLE_NAME +
                " WHERE " + COL2 + " = '" + name + "'";
        Cursor data = db.rawQuery(query, null);
        return data;
    }

    /**
     * Updates the name field
     * @param newName
     * @param id
     * @param oldName
     */
    public void updateName(String newName, int id, String oldName){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "UPDATE " + TABLE_NAME + " SET " + COL2 +
                " = '" + newName + "' WHERE " + COL1 + " = '" + id + "'" +
                " AND " + COL2 + " = '" + oldName + "'";
        db.execSQL(query);
    }

    /**
     * Delete from database
     * @param id
     * @param name
     */
    public void deleteName(int id, String name){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "DELETE FROM " + TABLE_NAME + " WHERE "
                + COL1 + " = '" + id + "'" +
                " AND " + COL2 + " = '" + name + "'";
        db.execSQL(query);
    }
    public void remove(int id){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "DELETE FROM " + TABLE_NAME + " WHERE "
                + COL1 + " = '" + id + "'";
        db.execSQL( query);
    }
}

ListDataActivity.class

  public class ListDataActivity extends AppCompatActivity{

    DatabaseHelper mDatabaseHelper;
    private ListView mListView;
    ArrayList<String> listData;
    ArrayList<String> UserSelection = new ArrayList<>();
    ArrayList<Integer> listDataSelect;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_layout);
        mListView = (ListView) findViewById(R.id.listView);
        mListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
        mListView.setMultiChoiceModeListener(modeListener);
        mDatabaseHelper = new DatabaseHelper(this);

        populateListView();
    }
    private void populateListView() {
        //get the data and append to a list
        Cursor data = mDatabaseHelper.getData();
        listData = new ArrayList<>();
        while (data.moveToNext()) {
            //get the value from the database in column 1
            //then add it to the ArrayList
            listData.add(data.getString(1));
        }
        //create the list adapter and set the adapter
        ListAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listData);
        mListView.setAdapter(adapter);
    }
    private void toastMessage(String message){
        Toast.makeText(this,message, Toast.LENGTH_SHORT).show();
    }
    AbsListView.MultiChoiceModeListener modeListener=new AbsListView.MultiChoiceModeListener() {
        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {

            if (UserSelection.contains(listData.get(position))) {
                UserSelection.remove(listData.get(position));
            } else {
                UserSelection.add(listData.get(position));
            }
            mode.setTitle(UserSelection.size() + " items selected....");

            String name=listData.get(position);
            Cursor data = mDatabaseHelper.getItemID(name);
            int itemID = -1;
            while(data.moveToNext()){
                itemID = data.getInt(0);
                listDataSelect.add(itemID);
            }

        }
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            MenuInflater menuInflater=mode.getMenuInflater();
            menuInflater.inflate(R.menu.menu_context,menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return true;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch (item.getItemId()){
                case R.id.menu_delete:
                     for(int i=0; i<listDataSelect.size();i++){
                        mDatabaseHelper.remove(listDataSelect.get(i));
                     }
                break;
            }
            return true;
        }
        @Override
        public void onDestroyActionMode(ActionMode mode) {
        }
    };
}

1 Ответ

0 голосов
/ 08 ноября 2018

Посмотрите, в onActionItemClicked(..) позвонив по этой строке:
mDatabaseHelper.remove(pos);
Вы удаляете только элемент со значением pos. В вашем коде есть несколько проблем, особенно при присваивании идентификатора элемента (идентификатор заполняется из listView, а не базы данных id) и передачи в качестве аргумента глобальной переменной remove().
Позвольте мне уточнить, что я сказал. Начиная с remove() из вашего dbHelper класса, он удаляет строку, в которой таблица id равна пропущенной id. Проблема в том, что вы передаете ListView item id, чтобы, если у пользователя было больше элементов или он уже выполнил много операций, он выдавал исключение или не удалялся, потому что в вашей базе данных нет такого id.
Подводя итог, все, что вам нужно сделать, передав аргумент этому методу, это передать в качестве аргумента databaseId (вы можете получить этот идентификатор, создав дополнительный метод).

Во-вторых, в вашем onItemCheckedChanged() вы не можете присвоить новое значение глобальной переменной. Каждый раз, когда вы проверяете новый элемент, переменная изменяется. По этой причине последний элемент удаляется или является случайным (хотя и не случайным).

Хорошо, это выглядит как длинный текст, содержащий много понимания, но решение намного проще, чем вы думаете.

В onItemCheckedStateChanged() каждый раз получать строку базы данных id и передавать ее в глобальный список. В данный момент вы передаете пункт id. Затем в onActionItemClicked() запустите для вызова цикла метод remove() из Helper класса и передайте элемент из List в качестве аргумента.
Это все!

Кстати, рассмотрите возможность использования RecyclerView вместо ListView - это намного лучше и новее.

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