首页 > 解决方案 > 未从 SQLite 中删除的行

问题描述

我正在尝试从 GoalWeight、Goal Date 和 Current Weight 的输入中删除该行。它没有出错,但该行没有被删除。

删除布局

Button deleteB;
    DatabaseHelper myDB;
    EditText goalD;
    EditText goalW;
    EditText currentW;
    Intent j;
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.deletelayout);
        deleteB = findViewById(R.id.buttonDelete);
        myDB = new DatabaseHelper(this);

        deleteB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                goalD = findViewById(R.id.goaldinput2);
                goalW = findViewById(R.id.goalwinput3);
                currentW = findViewById(R.id.currentWinput2);
                if(goalD.length() !=0 && goalW.length() !=0 && currentW.length() !=0){
                    Toast.makeText(DeleteLayout.this,"Goal Date: " +goalD.getText().toString()+ "Goal Weight: " + goalW.getText().toString()+
                                    "Current Weight: " +currentW.getText().toString()+ " entered.",
                            Toast.LENGTH_LONG).show();
                    myDB.deleteContent(goalD.getText().toString(), goalW.getText().toString(), currentW.getText().toString());

                    j = new Intent(DeleteLayout.this, historyActivity.class);
                    startActivity(j);



                }
                else{
                    Toast.makeText(DeleteLayout.this,"All data not entered.", Toast.LENGTH_LONG).show();
                }

            }
        });

DatabaseHelper 中的删除方法

public void deleteContent(String goalDate, String goalWeight,String currentWeight){
            SQLiteDatabase db = this.getWritableDatabase();
            String query = " DELETE FROM " + TABLE_NAME + "WHERE GDATE = "+
                    goalDate + " AND " + "GWEIGHT = " + goalWeight + " AND " + "CWEIGHT = " + currentWeight  ;
    }

标签: androidandroid-sqlite

解决方案


主要问题(不是唯一的问题)是在内部deleteContent(),尽管您创建了 SQL 语句,但您从不通过 say 执行它execSQL()
因此,不会尝试删除任何行。
但是,您应该更改为使用该delete()方法,如下所示:

public int deleteContent(String goalDate, String goalWeight, String currentWeight){
    SQLiteDatabase db = this.getWritableDatabase();
    String where = "GDATE = ? AND GWEIGHT = ? AND CWEIGHT = ?";
    int rows = db.delete(TABLE_NAME, where, new String[] {goalDate, goalWeight, currentWeight});
    db.close();
    return rows;
}

这是推荐的方式,因为它是安全的,并且它还返回受影响/删除的行数(您可以检查以检查删除是否成功)。
所以你可以像这样使用它:

int rows = myDB.deleteContent(
        goalD.getText().toString(), 
        goalW.getText().toString(), 
        currentW.getText().toString()
);

在变量中,rows您将获得已删除行的数量。


推荐阅读