【问题标题】:Update row in SQlite database by row position in android通过android中的行位置更新SQlite数据库中的行
【发布时间】:2013-04-26 20:21:40
【问题描述】:

我有包含“日期”列和“项目”列的数据库。 我希望该用户可以更新数据库中的特定行。 我试图用 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); 
    }

【问题讨论】:

标签: android sqlite


【解决方案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); 

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

【讨论】:

  • 很好的答案,谢谢!我想我明白你的回答,我只是不知道 SQL 命令。在这行代码: String whereClause = ITEM_COLUMN + " = ? and " + DATE_COLUMN + " = ?";我应该在“?”中输入什么?一个字符串?一个长号码?
  • 那个?实际上是一个?。它不是供您替换的。
  • 这就是whereArgs 的用途,sqlite 会为您替换。如果需要,它也会进行转义,sqlite可以使用这种格式根据类似查询的重复进行优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多