我在更新数据库时遇到了一些困难。基本上用户会将数据输入两个不同的位置,所以我们得到
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中调用此方法。
非常感谢任何帮助
答案 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
。