【问题标题】:How to delete item from ListView and SQLite database?如何从 ListView 和 SQLite 数据库中删除项目?
【发布时间】:2018-11-08 11:56:00
【问题描述】:

我使用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) {
        }
    };
}

【问题讨论】:

    标签: android sqlite listview


    【解决方案1】:

    看,在onActionItemClicked(..) 中调用此行:
    mDatabaseHelper.remove(pos);
    您只删除值为pos 的项目。您的代码中有几个问题,尤其是分配项目 id(从 listView 填充的 id,而不是 id 数据库)并将作为参数传递给 remove() 全局变量。
    让我澄清一下我所说的。从您的dbHelper 类中的remove() 开始,它会删除表id 等于通过id 的行。问题是您传递了ListView item id,这样如果用户有更多项目或已经进行了很多操作,它将抛出异常或不会删除,因为您的数据库中没有这样的id
    总而言之,通过将参数传递给此方法,您所要做的就是将 databaseId 作为参数传递(您可以通过创建附加方法来获取此 id)。

    其次,在您的onItemCheckedChanged() 中,您不能为全局变量分配新值。每次检查新项目时,变量都会发生变化。这就是为什么最后一项被删除或随机一项(尽管不是随机的)的原因。

    好的,它看起来像一个包含很多理解的长文本,但解决方案比您想象的要容易得多。

    onItemCheckedStateChanged() 中每次获取数据库行id 并将其传递给全局列表。目前您通过项目id。然后在onActionItemClicked() 中从Helper 类中运行for 循环调用方法remove(),并将List 中的项目作为参数传递。
    就这样!

    顺便说一句,考虑使用 RecyclerView 代替 ListView - 它更好、更新。

    【讨论】:

    • 但是onItemCheckedStateChanged方法没有adapterView,获取row id是getItemId方法列表的选中项数据。我一直在寻找很多解决方案,但无法弄清楚如何解决这个问题。如果您不难展示解决方案,请。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多