我有一个这样构造的数据库

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知识。

10-07 13:28
查看更多