如何在sqlite数据库中按ID删除ListViews项目

时间:2017-01-02 22:00:13

标签: java android sqlite

我按照这里的教程:Tutorial todo APP,我想自定义代码nad构建培训应用程序。我的第一个更改是按照数据库中的ID删除事物(在示例中,它们被名称删除)。这是我当前负责删除项目的代码:

 // FUNCTION for DELETING EXERCISE
 public void deleteExercise(View view) {
    final View parent = (View) view.getParent();
    AlertDialog dialog = new AlertDialog.Builder(this)
            .setMessage("Are you sure, you want to delete exercise?")
            .setPositiveButton("Delete", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    TextView exerciseTextView = (TextView) parent.findViewById(R.id.exercise_name);
                    String exercise = String.valueOf(exerciseTextView.getText());
                    SQLiteDatabase db = mHelper.getWritableDatabase();
                    db.delete(ExerciseContract.ExerciseEntry.TABLE,
                            ExerciseContract.ExerciseEntry.COL_EXERCISE_NAME + " = ?",
                            new String[]{exercise});
                    db.close();
                    updateUI();
                }
            })
            .setNegativeButton("Cancel", null)
            .create();
    dialog.show();
}

// UPDATING USER INTERFACE AFTER CHANGES IN DB
private void updateUI() {
    ArrayList<String> exerciseList = new ArrayList<>();
    SQLiteDatabase db = mHelper.getReadableDatabase();
    String[] projection = {
            ExerciseContract.ExerciseEntry._ID,
            ExerciseContract.ExerciseEntry.COL_EXERCISE_NAME,
            //ExerciseContract.ExerciseEntry.COL_EXERCISE_DESCRIPTION
    };
    Cursor cursor = db.query(
            ExerciseContract.ExerciseEntry.TABLE, //tablica do zapytań
            projection, //zwracane kolumny
            null,  //columny dla WHERE
            null, //wartosci dla WHERE
            null,//nie grupuj wierszy
            null,//nie filtruj grup
            null); //porządek sortowania
    while (cursor.moveToNext()) {
        int idx = cursor.getColumnIndex(ExerciseContract.ExerciseEntry.COL_EXERCISE_NAME);
        exerciseList.add(cursor.getString(idx));
    }

    if (mAdapter == null) {
        mAdapter = new ArrayAdapter<>(this,
                R.layout.item_workout,
                R.id.exercise_name,
                exerciseList);
        mWorkoutListView.setAdapter(mAdapter);
    } else {
        mAdapter.clear();
        mAdapter.addAll(exerciseList);
        mAdapter.notifyDataSetChanged();
    }

    cursor.close();
    db.close();
}

最简单的方法是什么?

2 个答案:

答案 0 :(得分:1)

你没有在任何地方返回id,我个人推荐一个自定义适配器。但是,我认为最简单的方法是在用户点击列表视图中的项目时将其删除。

在onItemClickListener上设置列表视图。

XML
<ff:FFImage VerticalAlignment="Stretch" 
            HorizontalAlignment="Stretch"
            TransformPlaceholders="False"
            LoadingPlaceholder="loading.png"
            ErrorPlaceholder="error.png"
            Height="500"
            Width="500"
            Source="http://loremflickr.com/600/600/nature?filename=simple.jpg">

对于删除任务,请在单击项目的_id中传递。

        mTaskListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Tasks task =(Tasks) mTaskListView.getItemAtPosition(position);

            deleteTask(task.getId());
        }
    });

在UpdateUI部分中,将此while循环更改为也检索_id。

    public void deleteTask(long id) {

    //TextView taskTextView = (TextView) parent.findViewById(R.id.task_title);
    //String task = String.valueOf(taskTextView.getText());
    SQLiteDatabase db = mHelper.getWritableDatabase();
    db.delete(TaskContract.TaskEntry.TABLE, TaskContract.TaskEntry._ID + " = ?", new String[]{String.valueOf(id)});
    db.close();
    updateUI();
}

最后为您的任务创建一个模型。

      while (cursor.moveToNext()) {
        int title = cursor.getColumnIndex(TaskContract.TaskEntry.COL_TASK_TITLE);
        int _id = cursor.getColumnIndex(TaskContract.TaskEntry._ID);

        Tasks tasks = new Tasks();
        tasks.setId(cursor.getInt(_id));
        tasks.setTitle(cursor.getString(title));
        taskList.add(tasks);

    }

还要记得从LayoutFile中删除该按钮。你可以在删除之前显示一个对话框,但这是一个快速的解决方案。理想情况下,我建议您创建自己的自定义适配器。如果您希望保持按钮并以此方式删除它,您可能必须这样做。

Custom Adapter for List View

答案 1 :(得分:0)

在数据库助手类中创建常用方法。

parseInt()

现在onClick listView项目执行此操作:

Math.floor()