使用update方法更新SQLite行

时间:2015-02-17 23:15:49

标签: android sqlite sql-update

我正在尝试使用update(String表,ContentValues值,String whereClause,String [] whereArgs)方法在android上更新SQLite中的一行。我已经看到了很多关于这个引用的消息来源以及网络上描述如何这样做的地方,但它似乎没有起作用。我的主要问题是我对传递给方法的最后两个变量以及如何正确设置它们缺乏了解。

String whereClause:这是做什么的?传递null,更改列中的所有值,但是如果您只想切换一行,例如row" x"在sql数据库中;怎么会这样呢? 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();
        }

    }
}

2 个答案:

答案 0 :(得分:1)

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

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

当您传递表名时,db.update()会为您执行第一步。 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);

这会更新所有'注意'列包含值""。

答案 1 :(得分:1)

Rhuarc13答案的更新:

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

这样你就不必担心使用where子句转义字符等了。另外update第二个参数需要ContentValues,而不是字符串,所以写下来他的答案不起作用。

但是,您的表中似乎没有“位置”字段。 id字段可能对应也可能不对应于表中行的位置,因此您不应该依赖它。如果你有办法获得id,那很好,否则你会想要另一个你可以设置正确值的字段来反映该行的位置,并将其用于你的更新。

编辑:如果您想通过ID查询:

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