Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试在Android中更新sqlite中最后一条记录中的某一列_Java_Android_Sqlite - Fatal编程技术网

Java 尝试在Android中更新sqlite中最后一条记录中的某一列

Java 尝试在Android中更新sqlite中最后一条记录中的某一列,java,android,sqlite,Java,Android,Sqlite,我有一个这样构造的数据库 uid | username | password | email | cur_level 1 default abc123 me@email.com 0 在我的游戏中,在主活动中完成一个关卡后,我运行一个名为rease\u current\u level() 值++; test_db.open(); 测试数据库更新级别(值); 电流水平=数值; test_db.close() 所以这似乎没有问题,但是当运行test\u db.

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

uid | username | password |     email   | cur_level
1     default      abc123   me@email.com    0
在我的游戏中,在主活动中完成一个关卡后,我运行一个名为
rease\u current\u level()
值++; test_db.open(); 测试数据库更新级别(值); 电流水平=数值; test_db.close()

所以这似乎没有问题,但是当运行
test\u 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;

    }
我的日志cat错误似乎是:

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

从代码中可以看出,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\u ROWID=“id”

对于您的
whereClause
,您实际上是在传递

"id = WHERE id = (SELECT max(id) FROM DATABASE_TABLE"
这是无效的SQL

您似乎不需要“
id=
”。只需在
WHERE
子句开头加上“
whereid=

但是,您的问题意味着您在数据库中只有一条记录。为什么对一条记录使用DB?如果其中有多条记录,则应使用
WHERE
子句搜索唯一的内容,而不是使用
selectmax(id)


底线是您需要提高对SQL的了解。

函数
update
已经将
WHERE
放入查询中,并且您已经复制了列名(
KEY\u ROWID
“id”
)。使用:


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

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

如果存在多行,则在调用update函数之前,需要知道要更新的行的uid。在这种情况下,它会像这样

String dbID=“要更新的行的唯一id”

返回mDb.update(DATABASE_TABLE,args,“id=?”,新字符串[]{dbID})>0


希望这有帮助。

嗯,我需要某种持久性存储。我知道android有SharedReferences,但如果我只需要一张唱片,那真的是这样吗?即使记录中可能有“吨”的“列”?也没有得到回复。。。但我最终还是使用了sharedprefs。使用数据库而不是sharedprefs可以很容易地在同一台设备上添加对多个播放器的支持。我的孩子们一直在我的手机上玩游戏。
mDb.update(..., KEY_ROWID + "= (SELECT ...)");