我有一个这样构造的数据库
uid | username | password | email | cur_level
1 default abc123 me@email.com 0
在完成主要活动中的关卡后,在我的游戏中,我运行一种称为
increase_current_level()
的方法价值++;
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还是很陌生,所以有点吓人,但我希望有人看到一个非常明显的缺陷。谢谢
更新1:
我更新的代码:
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
最佳答案
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
”开始您的WHERE id=
子句但是,您的问题意味着您在数据库中只有一条记录。为什么要将数据库用于一条记录?而且,如果其中有多个记录,则应使用
WHERE
子句搜索唯一的内容,而不要使用SELECT max(id)
。最重要的是,您需要提高您的SQL知识。