首页 文章

使用update方法更新SQLite行

提问于
浏览
0

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

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();
        }

    }
}

2 回答

  • 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 whereClause 具有 column_name1 = value1 子句的完整选项, String[] whereArgs 就可以传递 null 选项 .

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

    如果你想将一行设置为'x',你会这样做:

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

    这将更新'note'列包含值“the”的所有行 .

  • 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);
    

相关问题