rawQuery没有用cursor.moveToFirst,android studio更新数据库

时间:2016-05-17 04:16:08

标签: android sqlite cursor

我在更新数据库时遇到了一些困难。基本上用户会将数据输入两个不同的位置,所以我们得到

Name    | Letter  | Marks   
----------------------------
Dave    | Null    | 90
Dave    | A       | Null

应该成为

Dave    | A       | 90

然而,没有任何更新。当我在SQLite Manager中尝试时,查询工作正常,所以我必须实现错误的游标。

    public void insertData(String name, int mark_column, String marks) {
        String [] columns = new String[] {COL_3, COL_4, COL_5};
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL_2, name);
        contentValues.put(columns[mark_column], marks);
        db.replace(TABLE_NAME, null, contentValues);
        //The code above works as desired
        String sql = "SELECT NAME, GROUP_CONCAT(LETTER, ', ') AS LETTER," +
            "GROUP_CONCAT(MARKS, ', ') AS MARKS FROM " + TABLE_NAME + " GROUP BY NAME";
        //This query works in SQLite Manager
        Cursor c = db.rawQuery(sql, null);
        c.moveToFirst();
        while(c.moveToNext());
        c.close();
    }

我尝试了c.moveToLast的各种组合,没有c.moveToNext等。在onClick of Alert Dialog中调用此方法。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

关于光标:

我认为您的查询没有任何问题。如果您没有“看到”应用中的任何结果,可能是因为您实际上没有对结果做任何事情。它们存在于Cursor对象的内存中,但这就是全部;如果你想看到任何东西你必须将这些数据绑定到某些UI组件,或者将它转储到logcat或其他东西。

请注意,如果您要在while循环中添加代码,则会跳过光标的第一行,因为您将进行moveToFirst()调用,然后紧跟moveToNext()呼叫。这是我迭代Cursor的方式,它始终有效:

if (cusor != null) {
    try {
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            // do something with data in current row
        }
    } finally {
        cursor.close();
    }
}

关于更新:

您实际上没有进行更新本身,您正在进行插入。 SQLiteDatabase.replace()执行此命令:

INSERT OR REPLACE INTO tableName(columns) VALUES (values);

只有当您对表有约束并且插入具有这些值的新行将违反该约束时,才可以将其作为更新使用(描述了here对不同约束违规的确切处理)。对于我怀疑您期望的约束类型,此操作将删除现有行并插入具有这些值的新行,但不会将已删除行中的值转移到新行中。换句话说,如果您希望发生替换,则需要全部 ContentValues中的组合值。它不像UPDATE,您可以在其中设置某些列的值。

你应该尝试做一个实际的update。确保使用正确的WHERE子句,以便只更新重要的行。

我可能误解了你的方法,但是描述使你看起来像是在插入两行,然后尝试更新和/或将它们组合起来。这对我来说没有意义,我预见到错误,你有剩余的行不完整,需要清理。在我看来,最好构造代码,以便有一个INSERT,之后的每个操作都是感兴趣行上的UPDATE