Android 如何删除SQL数据库中的项?

Android 如何删除SQL数据库中的项?,android,listview,android-studio,delete-row,Android,Listview,Android Studio,Delete Row,我知道有很多帖子或多或少都有相同的主题,但没有一个能涵盖我的情况: 我有一个删除按钮,可以删除列表视图中的一个项目,但当你关闭应用程序并重新打开它时,项目会重新出现。我不知道怎么解决这个问题 DatabaseHelper.java public class DatabaseHelper extends SQLiteOpenHelper { public static final String DATABASE_NAME = "todo.db"; public static final int D

我知道有很多帖子或多或少都有相同的主题,但没有一个能涵盖我的情况:

我有一个删除按钮,可以删除列表视图中的一个项目,但当你关闭应用程序并重新打开它时,项目会重新出现。我不知道怎么解决这个问题

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "todo.db";
public static final int DATABASE_VERSION = 1;
public static final String ITEMS_TABLE = "items";

private static DatabaseHelper instance = null;

public static DatabaseHelper getInstance(Context context) {

    if(instance == null) {
        instance = new DatabaseHelper(context);
    }
    return instance;
}

private DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {

    String createQuery = "CREATE TABLE " + ITEMS_TABLE + " (" +
            "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
            "description TEXT NOT NULL, " +
            "completed INTEGER NOT NULL DEFAULT 0)";
    db.execSQL(createQuery);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
 public class MainActivity extends AppCompatActivity {

private static final String LOG_TAG = "ToDoApp";

private ToDoListManager listManager;
private ToDoItemAdapter adapter;

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

    ListView todoList = (ListView) findViewById(R.id.todo_list);

    listManager = new ToDoListManager(getApplicationContext());

    adapter = new ToDoItemAdapter(
            this,
            listManager.getList()
    );

    todoList.setAdapter(adapter);

    ImageButton addButton = (ImageButton) findViewById(R.id.add_item);
    addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onAddButtonClick();
        }
    });
}

@Override
protected void onPause() {
    super.onPause();
}

private void onAddButtonClick() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(R.string.add_item);

    final EditText input = new EditText(this);
    input.setInputType(InputType.TYPE_CLASS_TEXT);
    builder.setView(input);

    builder.setPositiveButton(
            R.string.ok,
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    ToDoItem item = new ToDoItem(
                            input.getText().toString(),
                            false
                    );
                    listManager.addItem(item);
                    adapter.swapItems(listManager.getList());
                }
            });

    builder.setNegativeButton(
            R.string.cancel,
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });

    builder.show();
}

private class ToDoItemAdapter extends ArrayAdapter<ToDoItem> {

    private Context context;
    private List<ToDoItem> items;
    private LayoutInflater inflater;

    public ToDoItemAdapter(
            Context context,
            List<ToDoItem> items
    ) {
        super(context, -1, items);

        this.context = context;
        this.items = items;
        this.inflater = LayoutInflater.from(context);
    }

    public void swapItems(List<ToDoItem> items) {
        this.items = items;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        final ItemViewHolder holder;

        if(convertView == null) {

            convertView = inflater.inflate(R.layout.to_do_item_layout, parent, false);


            holder = new ItemViewHolder();
            holder.itemDescription = (TextView) convertView.findViewById(R.id.item);
            holder.itemState = (CheckBox) convertView.findViewById(R.id.checkBox);
            convertView.setTag(holder);
        }else {
            holder = (ItemViewHolder) convertView.getTag();
        }


       holder.itemDescription.setText(items.get(position).getDescription());
        holder.itemState.setChecked(items.get(position).isComplete());

        holder.itemState.setTag(items.get(position));

        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ToDoItem item = (ToDoItem) holder.itemState.getTag();
                item.toggleComplete();
                listManager.updateItem(item);
                notifyDataSetChanged();
            }
        });
        ImageButton deleteButton = (ImageButton) convertView.findViewById(R.id.delete_Button);
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                items.remove(items.get(position));
                notifyDataSetChanged();
            }
        });

        holder.itemState.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ToDoItem item = (ToDoItem) holder.itemState.getTag();
                item.toggleComplete();
                listManager.updateItem(item);
                notifyDataSetChanged();

            }
        });

        return convertView;
    }
}

public static class ItemViewHolder{
    public TextView itemDescription;
    public CheckBox itemState;
     }
 }
public class ToDoListManager {

private DatabaseHelper dbHelper;

public ToDoListManager(Context context) {

    dbHelper = DatabaseHelper.getInstance(context);
}

public List<ToDoItem> getList() {

    SQLiteDatabase db = dbHelper.getReadableDatabase();
    Cursor cursor = db.rawQuery(
            "SELECT * FROM " + DatabaseHelper.ITEMS_TABLE,
            null
    );

    List<ToDoItem> items = new ArrayList<>();

    if(cursor.moveToFirst()) {
        while(!cursor.isAfterLast()) {

            ToDoItem item = new ToDoItem(
                    cursor.getString(cursor.getColumnIndex("description")),
                    cursor.getInt(cursor.getColumnIndex("completed")) != 0,
                    cursor.getLong(cursor.getColumnIndex("_id"))
            );
            items.add(item);
            cursor.moveToNext();
        }
    }
    cursor.close();
    return items;
}

public void addItem(ToDoItem item) {

    ContentValues newItem = new ContentValues();
    newItem.put("description", item.getDescription());
    newItem.put("completed", item.isComplete());

    SQLiteDatabase db = dbHelper.getWritableDatabase();
    db.insert(DatabaseHelper.ITEMS_TABLE, null, newItem);


}

public void updateItem(ToDoItem item) {

    ContentValues editItem = new ContentValues();
    editItem.put("description", item.getDescription());
    editItem.put("completed", item.isComplete());

    SQLiteDatabase db = dbHelper.getWritableDatabase();

    String[] args = new String[] { String.valueOf(item.getId()) };

    db.update(DatabaseHelper.ITEMS_TABLE, editItem, "_id=?", args);

  }
}
public class ToDoItem {

private String description;
private boolean isComplete;
private long id;

public ToDoItem(String description, boolean isComplete) {
 this(description, isComplete, -1);
}
public ToDoItem(String description,boolean isComplete,long id) {
    this.description = description;
    this.isComplete = isComplete;
    this.id = id;
}

public String getDescription() {
    return description;
}

public boolean isComplete() {
    return isComplete;
}

public void toggleComplete() {
    isComplete = !isComplete;
}
public long getId() {return id;}

@Override
public String toString() {

    return getDescription();
  }
}
该按钮工作正常,但不会永久删除。我不知道它是否是代码,或者它是否在我的
MainActivity
中放置的位置。如果有人告诉我,我将不胜感激

MainActivity.java

public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "todo.db";
public static final int DATABASE_VERSION = 1;
public static final String ITEMS_TABLE = "items";

private static DatabaseHelper instance = null;

public static DatabaseHelper getInstance(Context context) {

    if(instance == null) {
        instance = new DatabaseHelper(context);
    }
    return instance;
}

private DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {

    String createQuery = "CREATE TABLE " + ITEMS_TABLE + " (" +
            "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
            "description TEXT NOT NULL, " +
            "completed INTEGER NOT NULL DEFAULT 0)";
    db.execSQL(createQuery);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
 public class MainActivity extends AppCompatActivity {

private static final String LOG_TAG = "ToDoApp";

private ToDoListManager listManager;
private ToDoItemAdapter adapter;

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

    ListView todoList = (ListView) findViewById(R.id.todo_list);

    listManager = new ToDoListManager(getApplicationContext());

    adapter = new ToDoItemAdapter(
            this,
            listManager.getList()
    );

    todoList.setAdapter(adapter);

    ImageButton addButton = (ImageButton) findViewById(R.id.add_item);
    addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onAddButtonClick();
        }
    });
}

@Override
protected void onPause() {
    super.onPause();
}

private void onAddButtonClick() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(R.string.add_item);

    final EditText input = new EditText(this);
    input.setInputType(InputType.TYPE_CLASS_TEXT);
    builder.setView(input);

    builder.setPositiveButton(
            R.string.ok,
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    ToDoItem item = new ToDoItem(
                            input.getText().toString(),
                            false
                    );
                    listManager.addItem(item);
                    adapter.swapItems(listManager.getList());
                }
            });

    builder.setNegativeButton(
            R.string.cancel,
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });

    builder.show();
}

private class ToDoItemAdapter extends ArrayAdapter<ToDoItem> {

    private Context context;
    private List<ToDoItem> items;
    private LayoutInflater inflater;

    public ToDoItemAdapter(
            Context context,
            List<ToDoItem> items
    ) {
        super(context, -1, items);

        this.context = context;
        this.items = items;
        this.inflater = LayoutInflater.from(context);
    }

    public void swapItems(List<ToDoItem> items) {
        this.items = items;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        final ItemViewHolder holder;

        if(convertView == null) {

            convertView = inflater.inflate(R.layout.to_do_item_layout, parent, false);


            holder = new ItemViewHolder();
            holder.itemDescription = (TextView) convertView.findViewById(R.id.item);
            holder.itemState = (CheckBox) convertView.findViewById(R.id.checkBox);
            convertView.setTag(holder);
        }else {
            holder = (ItemViewHolder) convertView.getTag();
        }


       holder.itemDescription.setText(items.get(position).getDescription());
        holder.itemState.setChecked(items.get(position).isComplete());

        holder.itemState.setTag(items.get(position));

        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ToDoItem item = (ToDoItem) holder.itemState.getTag();
                item.toggleComplete();
                listManager.updateItem(item);
                notifyDataSetChanged();
            }
        });
        ImageButton deleteButton = (ImageButton) convertView.findViewById(R.id.delete_Button);
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                items.remove(items.get(position));
                notifyDataSetChanged();
            }
        });

        holder.itemState.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ToDoItem item = (ToDoItem) holder.itemState.getTag();
                item.toggleComplete();
                listManager.updateItem(item);
                notifyDataSetChanged();

            }
        });

        return convertView;
    }
}

public static class ItemViewHolder{
    public TextView itemDescription;
    public CheckBox itemState;
     }
 }
public class ToDoListManager {

private DatabaseHelper dbHelper;

public ToDoListManager(Context context) {

    dbHelper = DatabaseHelper.getInstance(context);
}

public List<ToDoItem> getList() {

    SQLiteDatabase db = dbHelper.getReadableDatabase();
    Cursor cursor = db.rawQuery(
            "SELECT * FROM " + DatabaseHelper.ITEMS_TABLE,
            null
    );

    List<ToDoItem> items = new ArrayList<>();

    if(cursor.moveToFirst()) {
        while(!cursor.isAfterLast()) {

            ToDoItem item = new ToDoItem(
                    cursor.getString(cursor.getColumnIndex("description")),
                    cursor.getInt(cursor.getColumnIndex("completed")) != 0,
                    cursor.getLong(cursor.getColumnIndex("_id"))
            );
            items.add(item);
            cursor.moveToNext();
        }
    }
    cursor.close();
    return items;
}

public void addItem(ToDoItem item) {

    ContentValues newItem = new ContentValues();
    newItem.put("description", item.getDescription());
    newItem.put("completed", item.isComplete());

    SQLiteDatabase db = dbHelper.getWritableDatabase();
    db.insert(DatabaseHelper.ITEMS_TABLE, null, newItem);


}

public void updateItem(ToDoItem item) {

    ContentValues editItem = new ContentValues();
    editItem.put("description", item.getDescription());
    editItem.put("completed", item.isComplete());

    SQLiteDatabase db = dbHelper.getWritableDatabase();

    String[] args = new String[] { String.valueOf(item.getId()) };

    db.update(DatabaseHelper.ITEMS_TABLE, editItem, "_id=?", args);

  }
}
public class ToDoItem {

private String description;
private boolean isComplete;
private long id;

public ToDoItem(String description, boolean isComplete) {
 this(description, isComplete, -1);
}
public ToDoItem(String description,boolean isComplete,long id) {
    this.description = description;
    this.isComplete = isComplete;
    this.id = id;
}

public String getDescription() {
    return description;
}

public boolean isComplete() {
    return isComplete;
}

public void toggleComplete() {
    isComplete = !isComplete;
}
public long getId() {return id;}

@Override
public String toString() {

    return getDescription();
  }
}

您只需删除适配器类中导致该项从当前listView中删除的项。但是,您的
topolistmanager.java
中没有任何函数可以从数据库中删除项目。从listView中删除不会影响对数据库项的访问

您可以将此函数添加到
ToDoListManager.java
类中

public void deleteItem(long itemId) {

    SQLiteDatabase db = dbHelper.getWritableDatabase();
    db.delete(DatabaseHelper.ITEMS_TABLE, "_id = ?",
            new String[] { String.valueOf(itemId) }); 
}
从删除按钮的onClick调用它,如下所示

ImageButton deleteButton = (ImageButton) convertView.findViewById(R.id.delete_Button);
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                long itemId = items.get(position).getId();
                items.remove(items.get(position));
                listManager.deleteItem(itemId);
                notifyDataSetChanged();
            }
        });

由于要从数据库中获取数据并在listview中显示,所以也需要从数据库中删除该行。在数据库适配器中创建一个如下所示的方法:

public boolean deleteItem(Long id) {
        return Db.delete(DATABASE_TABLE,"_id="+id,null) > 0;
    }

然后在list view item delete上,只需调用此方法并将行id作为参数传递。

我是新手,您能告诉我在哪里添加这段代码吗?在您的数据库帮助器类中,就像您的onCreate()和onUpgrade()方法一样。我按照您所说的做了,它说无法解析items listManager.deleteItem(item.getId());我编辑了我的答案。请重试
listManager.deleteItem(item.getId())无法解决此问题,因为在
onclick
scope
item
中未知,这是我的第一个答案中的打字错误,您需要在scope中使用
items
列表感谢您的出色回答,它将发挥您的最佳效果!我只是想知道我是否可以在你的帮助下添加更多的功能?我想在列表中添加项目的时间戳。你们认为你们能帮忙吗?我很高兴,我认为最好再问一个问题,把你们新问题的链接放在这里,我会在这里回答你们。如果这个答案有效,也请接受。