我的数据库包含“date”列和“item”列。 我希望该用户可以更新数据库中的特定行。 我试图在SQLiteDatabase类中使用update方法。 我的问题是,我不知道如何使更新方法找到我想要的行。 我看到一些使用一个单词参数的例子。 像这样:
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 :(得分: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循环。
第四,您甚至可以在更新中进行查询:
String whereClause = ITEM_COLUMN + " = ? and " + DATE_COLUMN + " = ?";
String[] whereArgs = new String[] { item, date };
ourDatabase.update(tableName, cvUpdate, whereClause, whereArgs);
额外提示:对列名等内容使用全大写变量名称,这有助于提高可读性。