2015-02-17 150 views
0

我想在android上使用更新(String table,ContentValues values,String whereClause,String [] whereArgs)方法更新SQLite中的一行。我在這個引用中看到了很多來源,並且在網絡上的其他地方描述瞭如何這樣做,但似乎並不奏效。我的主要問題是我對傳遞給方法的最後兩個變量缺乏瞭解,以及如何正確設置它們。使用更新方法更新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(); 
     } 

    } 
} 

回答

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

這將更新在「筆記」列包含值「的」所有行。

+0

對不起,我想我的措辭我的問題是錯誤的。我的意思是「x」是數據中的一行,例如第一行「x = 1,second」x = 2「或其他行。是否可以這樣做 – 2015-02-18 00:11:53

+0

@Neil M. 如在自動如果是這樣的話,當你創建UID列時,你已經有了自動增量 因此,每行的ID將是唯一的 – Rhuarc13 2015-02-18 02:36:58

+0

@NeilM如果你想找到ID爲2的列,你的'String whereClause = UID +「= 2」' – Rhuarc13 2015-02-18 02:40:08

1

的更新Rhuarc13的回答是:

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

這樣,你不必擔心逃避字符,例如與where子句。另外update需要一個ContentValues第二個參數,而不是一個字符串,因此寫他的答案將無法正常工作。

但是,表中似乎沒有「位置」字段。 id字段可能對應於表中該行的位置,因此您不應該依賴該字段。如果你有辦法得到id,那很好,否則你會需要另一個字段,你可以設置正確的值來反映該行的位置,並將其用於更新。

編輯:如果你想通過編號來查詢:

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

好吧,謝謝。所以如果我想讓它去等於2的_id字段,例如我會用2替換?對不起,如果這是一個愚蠢的問題,我是SQLite新手,但還不理解語法。 – 2015-02-18 00:17:58

+0

看我的編輯。如果變量'id'的值爲2,那麼將使用'newContentValues'中的任何值更新id = 2的行。 – nasch 2015-02-18 03:51:37

+0

發生這種情況是因爲'_id'具有整數親和性,但通常情況下,使用數字值的字符串參數無法正常工作。 – 2015-02-18 07:55:51