在 Android java 中尝试更新 sqlite 数据库中的现有行时出错?

Error when trying to update an existing row in sqlite database in Android java?

我正在尝试使用编辑文本中的值更新数据库。但我在记录器中收到错误消息:“*** Process: com.example.coursework2, PID: 12430 android.database.sqlite.SQLiteException: 没有这样的列: Wordc (code 1 SQLITE_ERROR): , 编译时: UPDATE Phrases_table SET word = Word WHERE word = Wordc 在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法)

Wordc 是存储在数据库中的单词,"Word" 是我试图更新数据库的值。我是新手,请帮忙。**

// 数据库 class, 我只有 1 列是 COL_2

public void updateName(String newName,String oldName) { // issue is here
    SQLiteDatabase db = this.getWritableDatabase();
    String query = "UPDATE " + TABLE_NAME + " SET " + COL_2 + " = " + newName + " WHERE " + COL_2 + " = " + oldName;
    db.execSQL(query);

/*Edit class,当我点击保存按钮时,我从单选按钮获取值并期望用编辑文本中的值更新数据库 */

 buttonSave.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    int pos = listView.getCheckedItemPosition();
                    if (pos > -1) {
                        val = list.get(pos).toString(); //getting value from the radio button which is stored in the database

                       String newWord= edit.getText().toString(); //getting text from edit text


                       myDb.updateName( newWord,val ); 

                    }

您正在直接传递本机查询,因此您需要在字符串值上使用引号:

String query = "UPDATE " + TABLE_NAME + " SET " + COL_2 + " = \"" + newName + "\" WHERE " + COL_2 + " = \"" + oldName + "\""; db.execSQL(query);

这将生成查询:

UPDATE Phrases_table SET word = "Word" WHERE word = "Wordc"

字符串值应该用单引号括起来:

public void updateName(String newName,String oldName) { // issue is here
    SQLiteDatabase db = this.getWritableDatabase();
    String query = "UPDATE " + TABLE_NAME + " SET " + COL_2 + " = '" + newName + "' WHERE " + COL_2 + " = '" + oldName + "'";
    db.execSQL(query);
}

但是您应该使用推荐的更安全的方法 update() 以及 ContentValues? 占位符:

public void updateName(String newName, String oldName) { // issue is here
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(COL_2, newName);
    db.update(TABLE_NAME, cv, COL_2 + "= ?", new String[] {oldName});
    db.close();
}

这样您就不必担心添加单引号或 sql injection 的风险。