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 ...)");