[英]Trying to update a certain column in the last record in sqlite in Android
我有一个这样结构的数据库
uid | username | password | email | cur_level
1 default abc123 me@email.com 0
在我的游戏中,当您完成主要活动中的一个关卡后,我会运行一个名为increase_current_level()
value++; 的方法; test_db.open(); test_db.updateLevel(value); cur_level = 值; test_db.close();
所以这似乎没有问题,但是当test_db.updateLevel(value)
运行时,当程序崩溃时。
在我的 DBHelper 中,更新级别的代码如下。
public boolean updateLevel(String level) {
ContentValues args = new ContentValues();
args.put(KEY_CUR_LEVEL, level);
return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "="
+ "WHERE id=(SELECT max(id) FROM DATABASE_TABLE)", null) > 0;
}
我的日志猫错误似乎是:
10-17 17:36:10.833: E/AndroidRuntime(1815): Caused by: android.database.sqlite.SQLiteException: near "WHERE": syntax error (code 1): , while compiling: UPDATE test SET cur_level=? WHERE _id=WHERE id=(SELECT max(id) FROM DATABASE_TABLE)
我对 SQLite 很陌生,所以有点吓人,但我希望有人能看到一个非常明显的缺陷。 谢谢
我更新的代码:
public boolean updateLevel(String level) {
ContentValues args = new ContentValues();
args.put(KEY_CUR_LEVEL, level);
return mDb.update(DATABASE_TABLE, args, KEY_ROWID + " = (SELECT max(id) FROM DATABASE_TABLE",
null) > 0;
}
更新错误消息:
10-17 18:26:50.804: E/AndroidRuntime(3684): Caused by: android.database.sqlite.SQLiteException: near "DATABASE_TABLE": syntax error (code 1): , while compiling: UPDATE test SET cur_level=? WHERE _id = (SELECT max(id) FROM DATABASE_TABLE
从您的代码来看,您的 WHERE 子句可能格式错误。 不应该是
"WHERE id=(SELECT max(id) FROM " + DATABASE_TABLE
代替
"WHERE id=(SELECT max(id) FROM DATABASE_TABLE)"
?
mDb.update
的语法是
update(table, ContentValues values, String whereClause, String[] whereArgs)
让我们假设KEY_ROWID = "id"
对于您的whereClause
,您实际上是在传递
"id = WHERE id = (SELECT max(id) FROM DATABASE_TABLE"
这不是有效的 SQL。
您似乎不需要“ id =
”。 只需以“ WHERE id=
”开始您的WHERE
子句
但是,您的问题意味着您在数据库中只有一条记录。 为什么要为一条记录使用数据库? 如果其中有多个记录,则应使用WHERE
子句搜索唯一的内容,而不是使用SELECT max(id)
。
最重要的是,您需要提高对 SQL 的了解。
update
函数已经将WHERE
放入查询中,并且您已经复制了列名( KEY_ROWID
和"id"
)。 用:
mDb.update(..., KEY_ROWID + "= (SELECT ...)");
如果您的表只有一行,那么您不需要 WHERE 子句。 以下语句应更新表中的所有行。 如果只有一个记录存在,这将解决您的问题。
返回 mDb.update(DATABASE_TABLE, args, null, null) > 0;
如果存在多于一行,您将需要在调用更新函数之前知道要更新的行的 uid。 在这种情况下,它看起来像这样......
String dbID = "要更新的行的唯一 ID";
返回 mDb.update(DATABASE_TABLE, args, "id=?", new String[]{dbID}) > 0;
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.