通过android中的行位置更新SQlite数据库中的行

时间:2013-05-02 15:22:32

标签: android sqlite

我的数据库包含“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); 
    }

1 个答案:

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

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