0

我有一个这样结构化的数据库

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 很陌生,所以这有点吓人,但我希望有人能看到一个非常明显的缺陷。谢谢

更新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
4

4 回答 4

1

从您的代码中,您的 WHERE 子句可能格式不正确。难道不应该

"WHERE id=(SELECT max(id) FROM " + DATABASE_TABLE

代替

"WHERE id=(SELECT max(id) FROM DATABASE_TABLE)"

?

于 2012-10-17T21:51:01.853 回答
1

的语法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 的了解。

于 2012-10-17T21:54:37.883 回答
0

update函数已将 aWHERE放入查询中,并且您已复制列名 ( KEY_ROWIDand "id")。采用:

mDb.update(..., KEY_ROWID + "= (SELECT ...)");
于 2012-10-17T21:55:52.237 回答
0

如果您的表只有一行,那么您不需要 WHERE 子句。以下语句应更新表中的所有行。如果只存在一条记录,这将解决您的问题。

返回 mDb.update(DATABASE_TABLE, args, null, null) > 0;

如果存在不止一行,则在调用更新函数之前,您需要知道要更新的行的 uid。在这种情况下,它看起来像这样......

String dbID = "你要更新的行的唯一id";

return mDb.update(DATABASE_TABLE, args, "id=?", new String[]{dbID}) > 0;

希望这可以帮助。

于 2012-10-18T00:12:22.530 回答