1

我的代码在下面,但它使我的应用程序崩溃。我对使用 db 还是很陌生,但这似乎是有道理的。有任何迹象表明为什么这不起作用?

 public void updateLevel(String level){
             mDb.rawQuery("UPDATE "+ DATABASE_TABLE + " SET " + KEY_CUR_LEVEL + " = " + level + " WHERE " + KEY_NAME + " = Default", null);
         }
4

3 回答 3

2

Default被解释为列名;如果是字符串,则必须使用'Default'.

为避免此类格式问题,建议使用参数,在 SQL 命令中以?. rawQuery它们从(或其他 SQL 函数的类似参数)的第二个参数中的相应条目中获取它们的值。这比放置'字符串、记住在字符串中转义'以及使用带有控制字符的字符串更容易。

mDb.rawQuery("UPDATE "+ DATABASE_TABLE +
             " SET " + KEY_CUR_LEVEL + " = " + level +
             " WHERE " + KEY_NAME + " = ?",
             new String[] { "Default" });
于 2012-10-17T16:00:55.100 回答
1

我看到两个问题:

1) 由于 SQL 注入,不鼓励使用 rawQuery。如果可能,请使用SQLiteDatabase 查询

2) 如果列是 varchar 类型,值应该用单引号括起来。

例子:

mDb.rawQuery("UPDATE "+ DATABASE_TABLE + " SET " + KEY_CUR_LEVEL + " = '" + level + "' WHERE " + KEY_NAME + " = 'Default'", null);

注意:以上查询是手动输入的,可能存在语法错误。

于 2012-10-17T16:01:14.363 回答
1

我发现使用更新方法不太容易出现人为错误。

ContentValues cv = new ContentValues();
cv.put(KEY_CUR_LEVEL, level);

mDb.update(DATABASE_TABLE, cv, "? = ?", new String[] { KEY_NAME, "Default"});
于 2012-10-17T16:12:50.210 回答