0

我有包含“日期”列和“项目”列的数据库。我希望该用户可以更新数据库中的特定行。我试图用 SQLiteDatabase 类中的更新方法来做到这一点。我的问题是我不知道如何让更新方法准确找到我想要的行。我看到了一些将它与一个单词的参数一起使用的示例。像这样:

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

1 回答 1

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

额外提示:对列名等内容使用全大写变量名,这有助于提高可读性。

于 2013-05-02T16:01:22.357 回答