使用更新方法更新 SQLite 行

Updating SQLite row using update method

我正在尝试使用 update(String table, ContentValues values, String whereClause, String[] whereArgs) 方法在 android 上更新 SQLite 中的一行。我在这个引用和网络上的其他地方看到了许多描述如何这样做的资源,但它似乎没有用。我的主要问题是我不了解传递给方法 do 的最后两个变量以及如何正确设置它们。

String whereClause:这是做什么的?传递 null 会更改列中的所有值,但是如果您只想切换一行,例如 sql 数据库中的第 "x" 行怎么办?那将如何完成? String[] whereArgs:这是做什么的?

代码

//how do you edit variable NOTE_TEXT at pos to be editedNote        
public void editNotes(int pos, String editedNote){
            SQLiteDatabase db = helper.getWritableDatabase();
            String postion = Integer.toString(pos);

            ContentValues newContentValues = new ContentValues();
            newContentValues.put(NoteDBHelper.NOTE_TEXT, editedNote);

        db.update(  "noteTable", newContentValues, NoteDBHelper.NOTE_TEXT + " = " + postion, null);
   }

static class NoteDBHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "noteDB";
    private static final int DATABASE_VERSION = 5;
    private static final String TABLE_NAME = "noteTable";
    private static final String UID = "_id";
    private static final String NOTE_TEXT = "note";
    private static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME + "";

   /* private static final String CREATE_TABLE = "CREATE TABLE "+ TABLE_NAME +
            " (" + UID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NOTE_TEXT +
            " VARCHAR(255), );";*/
   private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + UID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NOTE_TEXT + " VARCHAR(255)  );";

    public NoteDBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        try {
            db.execSQL(CREATE_TABLE);
        } catch (SQLiteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        try {
            db.execSQL(DROP_TABLE);
            onCreate(db);
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

WHERE 子句是查询的过滤器。 正常的 WHERE 子句看起来像这样

UPDATE table_name
SET column_name = value
WHERE column_name1 = value1 AND/OR column_name2 = value2 AND/OR...

db.update() 为您传递 table 名称时的第一步。 String whereClausecolumn_name1= 部分,value1 将放在 String[] whereArgs 位置。 String[] whereArgs 可以传递 null 选项,只要您的 String whereClause 具有 column_name1 = value1 子句的完整选项。

whereClause 充当过滤器以限制哪些行被 UPDATE 语句更改。

如果您想将一行设置为 'x',您可以这样做:

String whereClause = "note = \"the\"";
db.update("noteTable", "x", whereClause, null);

这将更新 'note' 列包含值 "the" 的所有行。

Rhuarc13 的回答更新:

String whereClause = "position = ?";
String[] values = new String[]{position};
db.update(TABLE_NAME, newContentValues, whereClause, values);

这样您就不必担心转义字符以及使用 where 子句的问题。另外 update 需要一个 ContentValues 作为第二个参数,而不是一个字符串,所以他的回答是行不通的。

但是,您的 table 中似乎没有 "position" 字段。 id 字段可能对应于行在 table 中的位置,也可能不对应,因此您不应依赖它。如果您有办法获取 ID,那很好,否则您将需要另一个字段,您可以将其设置为正确的值以反映该行的位置,并将其用于更新。

编辑:如果你想通过 id 查询:

String whereClause = UID + " = ?";
String[] values = new String[]{String.valueOf(id)};
db.update(TABLE_NAME, newContentValues, whereClause, values);