2013-05-02 76 views
0

我有包含「日期」列和「項目」列的數據庫。 我希望該用戶可以更新數據庫中的特定行。 我試圖用SQLiteDatabase類中的update方法來做到這一點。 我的問題是,我不知道如何使更新方法準確找到我想要的行。 我看到一些使用它的參數來自一個單詞的例子。 這樣的:更新SQlite數據庫中的行在Android中的行位置

ourDatabase.update(tableName, cvUpdate, rowId + "=" + item , null); 

我的問題是,我想更新具有特定項目和日期行。所以這個項目的名字是不夠的。 我試過下面的代碼,但它沒有工作,希望你能幫助我。

public void updateEntry(String item, String date) throws SQLException{ 

String[] columns = new String[]{myItem, myDate}; 
Cursor c = ourDatabase.query(tableName, columns, null, null, null, null, null); 

     long position; 

     ContentValues cvUpdate = new ContentValues(); 
     cvUpdate.put(date, myDate); 
     cvUpdate.put(item, myExercise); 


     int itemAll = c.getColumnIndex(myItem); 
     int dateAll = c.getColumnIndex(myDate); 

     for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
      if (c.getString(itemAll).equals(myItem) && c.getString(dateAll).equals(myDate)) 
      { 
       position = c.getPosition(); 
       break; 
      } 
     } 

     ourDatabase.update(tableName, cvUpdate, rowId + "=" + position , null); 
    } 
+0

你不能使用SQL? UPDATE mytable SET date = A WHERE date = X and item = Y – jarmod 2013-05-02 16:08:49

+0

用什麼方法放這個字符串? – tomer 2013-05-02 20:08:59

+0

看到http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/ – jarmod 2013-05-03 01:16:07

回答

1

首先,列String []應該包含列名,比如「_ID」,或者其他什麼是您已經使用的列名。鑑於您將myItem列的內容與對象myItem進行了比較,我認爲這裏存在混淆。

其次,rowId和position在SQL中是不同的東西,特別是當你刪除行時,因爲行id通常是自動增量,特別是因爲你的查詢沒有被明確排序。更換c.getPosition()c.getLong(c.getColumnIndex(ID_COLUMN))會更有意義。

第三,sql很好,因爲你可以查詢它。例如,而不是讓所有的項目和循環查找匹配的日期和項目,您可以:

String whereClause = ITEM_COLUMN + " = ? and " + DATE_COLUMN + " = ?"; 
String[] whereArgs = new String[] { item, date }; 
Cursor c = ourDatabase.query(tableName, columns, whereClause, whereArgs, null, null, null); 

,而不是你的for循環。

Forthly,你甚至可以使查詢的更新:

String whereClause = ITEM_COLUMN + " = ? and " + DATE_COLUMN + " = ?"; 
String[] whereArgs = new String[] { item, date }; 
ourDatabase.update(tableName, cvUpdate, whereClause, whereArgs); 

額外提示:使用全大寫變量名的contants如列名,它的可讀性幫助。

+0

很好的答案謝謝! 我想我明白你的答案,我只是不真正知道SQL命令。 在這行代碼中: String whereClause = ITEM_COLUMN +「=?and」+ DATE_COLUMN +「=?」; 我應該把什麼放在「?」一個字符串?一個很長的數字? – tomer 2013-05-02 20:08:36

+0

的?其實是一個?它不適合您替換它。 – njzk2 2013-05-03 07:37:14

+0

這是'whereArgs'的用途,sqlite替代了你。它也會根據需要進行轉義,sqlite可以根據類似查詢的重複來使用這種格式。 – njzk2 2013-05-03 07:38:15