我如何在 SQLite 中按 ID 删除?

How do I delete by ID in SQLite?

我是新手 Android 开发,我想我应该从尝试使用 SQLite 创建一个简单的待办事项列表应用程序开始。我拥有所有基本功能:添加、更新和删除任务。但是,我是按任务标题而不是按 ID 添加、更新和删除的。这会产生重复任务的问题(例如,同名任务被同时删除)。经过大量的互联网搜索,我仍然找不到这样做的方法。如果能提供任何帮助,我将不胜感激!

这是我的代码:

public class TaskDbHelper extends SQLiteOpenHelper {

    public TaskDbHelper(Context context) {
        super(context, TaskContract.DB_NAME, null, TaskContract.DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String createTable = "CREATE TABLE " + TaskContract.TaskEntry.TABLE + " ( " +
                TaskContract.TaskEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                TaskContract.TaskEntry.COL_TASK_TITLE + " TEXT NOT NULL, " +
                TaskContract.TaskEntry.COL_TASK_DATE + " DATE);";
        sqLiteDatabase.execSQL(createTable);
    }
}

Activity 显示任务的位置

public class ShowTaskActivity extends AppCompatActivity {

    private TaskDbHelper mHelper;
    private ListView mTaskListView;
    private ArrayAdapter<String> mAdapter;

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

        mHelper = new TaskDbHelper(this);
        mTaskListView = (ListView) findViewById(R.id.list_todo);

        updateUI();
    }

    private void updateUI() {
        ArrayList<String> taskList = new ArrayList<>();
        SQLiteDatabase sqLiteDatabase = mHelper.getReadableDatabase();
        Cursor cursor = sqLiteDatabase.query(
                TaskContract.TaskEntry.TABLE,  // Name of the table to be queried
                new String[]{  // Which columns are returned
                        TaskContract.TaskEntry._ID,
                        TaskContract.TaskEntry.COL_TASK_TITLE,
                        TaskContract.TaskEntry.COL_TASK_DATE},
                null, null, null, null, null);
        while (cursor.moveToNext()) {
            int index =     cursor.getColumnIndex(TaskContract.TaskEntry.COL_TASK_TITLE);
            taskList.add(cursor.getString(index));
        }

        if (mAdapter == null) {
            mAdapter = new ArrayAdapter<>(this,
                    task, // What view to use for the items
                    R.id.task_title, // Where to put the string of data
                    taskList); // Where to get the data
            mTaskListView.setAdapter(mAdapter);
        } else {
            mAdapter.clear();
            mAdapter.addAll(taskList);
            mAdapter.notifyDataSetChanged();
        }

        cursor.close();
        sqLiteDatabase.close();
    }

    // TODO: Change to delete by ID, not name
    public void deleteTask(View view) {
        View parent = (View) view.getParent();
        TextView taskTextView = (TextView) parent.findViewById(R.id.task_title);
        String task = taskTextView.getText().toString();
        SQLiteDatabase sqLiteDatabase = mHelper.getWritableDatabase();
        sqLiteDatabase.delete(
            TaskContract.TaskEntry.TABLE,  // Where to delete
            TaskContract.TaskEntry.COL_TASK_TITLE + " = ?",  // Boolean check
            new String[]{task});  // What to delete
        sqLiteDatabase.close();
        updateUI();
    }
}

任务添加代码

public void addTask(String task, String date) {
    SQLiteDatabase sqLiteDatabase = mHelper.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(TaskContract.TaskEntry.COL_TASK_TITLE, task);
    contentValues.put(TaskContract.TaskEntry.COL_TASK_DATE, date);
    sqLiteDatabase.insertWithOnConflict(
            TaskContract.TaskEntry.TABLE,
            null,
            contentValues,
            SQLiteDatabase.CONFLICT_REPLACE);
    sqLiteDatabase.close();
}

你可以试试这个方法删除 By id

  public void deleteData(String tableName, Integer id) {

    try {
        if (mWritableDB != null) {
            mWritableDB.execSQL("delete from " + tableName + " Where id = " + id);
        }
    } catch (Exception _exception) {
        _exception.printStackTrace();
    }
}
String rowId; //Set your row id here
SQLiteDatabase sqLiteDatabase = mHelper.getWritableDatabase();
sqLiteDatabase.delete(
                TaskContract.TaskEntry.TABLE,  // Where to delete
                KEY_ID+" = ?",  
                new String[]{rowId});  // What to delete
sqLiteDatabase.close();
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_NAME, KEY_ID + " = ?",new String[]{Long.toString(id)} );
db.close();