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

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

Класс DataBaseHelper

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.style.UpdateAppearance;
import android.util.Log;
import android.view.MenuItem;

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);
    }
    public void onOpen() {

    }

    /**
     * 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(String id){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "DELETE FROM " + TABLE_NAME + " WHERE "
                + COL1 + " = '" + id + "'";
        db.execSQL( query);
    }
    public void Delete(String tablename, String pos) {
        SQLiteDatabase db = this.getWritableDatabase();
        try {
            db.delete(tablename, "product_code" + "='" + pos + "'", null);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Класс ListDataActivity

import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class ListDataActivity extends AppCompatActivity{

    final String SAVED_TEXT = "saved_content10";
    DatabaseHelper mDatabaseHelper;
    private ListView mListView;
    ArrayList<String> listData;
    ArrayList<String>  UserSelection = new ArrayList<>();
    ListAdapter adapter;


    @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
        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() {

        int pos;
        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
            pos=position;
            if (UserSelection.contains(listData.get(position))) {
                UserSelection.remove(listData.get(position));
            } else {
                UserSelection.add(listData.get(position));
            }
            mode.setTitle(UserSelection.size() + " items selected....");

        }
        @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:
                    String str=listData.get(pos);
                    for (int i = (UserSelection.size() - 1); i >= 0; i--){
                        Delete_Item_DB(str);
                        listData.remove(str);
                        ((BaseAdapter) 
                    mListView.getAdapter()).notifyDataSetChanged();
                    }
                    break;
            }
            mode.finish();
            return true;
        }
        @Override
        public void onDestroyActionMode(ActionMode mode) {

        }
    };
        public void Delete_Item_DB(String item_id) {
            DatabaseHelper db = new DatabaseHelper(this);
            db.Delete("value_table",item_id);
            db.close();

    }

}
...