Java Android SQLite正在尝试更新一个字段
我的代码如下,但它使我的应用程序崩溃。我对db的工作还很陌生,但这似乎是有道理的。有没有迹象表明这可能不起作用Java Android SQLite正在尝试更新一个字段,java,android,sqlite,Java,Android,Sqlite,我的代码如下,但它使我的应用程序崩溃。我对db的工作还很陌生,但这似乎是有道理的。有没有迹象表明这可能不起作用 public void updateLevel(String level){ mDb.rawQuery("UPDATE "+ DATABASE_TABLE + " SET " + KEY_CUR_LEVEL + " = " + level + " WHERE " + KEY_NAME + " = Default", null); } 默认
public void updateLevel(String level){
mDb.rawQuery("UPDATE "+ DATABASE_TABLE + " SET " + KEY_CUR_LEVEL + " = " + level + " WHERE " + KEY_NAME + " = Default", null);
}
默认值被解释为列名;如果是字符串,则必须使用“Default”
为了避免像这样的格式问题,建议使用参数,这些参数在SQL命令中写为?。它们从rawQuery的第二个参数中的对应条目或其他SQL函数的类似参数中获取值。
这比在字符串中放置“环绕字符串,记住转义”更容易,并且使使用带有控制字符的字符串成为可能
mDb.rawQueryUPDATE+数据库_表+
设置+键当前级别+=+级别+
其中+键\名称+=?,
新字符串[]{Default};
默认值被解释为列名;如果是字符串,则必须使用“Default”
为了避免像这样的格式问题,建议使用参数,这些参数在SQL命令中写为?。它们从rawQuery的第二个参数中的对应条目或其他SQL函数的类似参数中获取值。
这比在字符串中放置“环绕字符串,记住转义”更容易,并且使使用带有控制字符的字符串成为可能
mDb.rawQueryUPDATE+数据库_表+
设置+键当前级别+=+级别+
其中+键\名称+=?,
新字符串[]{Default};
我看到两个问题:
1由于SQL注入,使用rawQuery是不可取的。如果可能,请使用
2如果列的类型为varchar,则值应在单引号中
例如:
mDb.rawQuery("UPDATE "+ DATABASE_TABLE + " SET " + KEY_CUR_LEVEL + " = '" + level + "' WHERE " + KEY_NAME + " = 'Default'", null);
注意:上面的查询是手工输入的,可能有语法错误。我发现两个问题:
1由于SQL注入,使用rawQuery是不可取的。如果可能,请使用
2如果列的类型为varchar,则值应在单引号中
例如:
mDb.rawQuery("UPDATE "+ DATABASE_TABLE + " SET " + KEY_CUR_LEVEL + " = '" + level + "' WHERE " + KEY_NAME + " = 'Default'", null);
注意:上面的查询是手工输入的,可能有语法错误。我发现使用该方法不太容易出现人为错误
ContentValues cv = new ContentValues();
cv.put(KEY_CUR_LEVEL, level);
mDb.update(DATABASE_TABLE, cv, "? = ?", new String[] { KEY_NAME, "Default"});
我发现使用这种方法不太容易出现人为错误
ContentValues cv = new ContentValues();
cv.put(KEY_CUR_LEVEL, level);
mDb.update(DATABASE_TABLE, cv, "? = ?", new String[] { KEY_NAME, "Default"});
感谢您的输入,但由于我不是从用户那里获取文本,我相信我不必担心SQL注入。@EGHDK:SQL注入不仅仅是因为用户输入,如果该键已经存储了任何特殊字符,则可能会出现这种情况。如果您对该问题不太敏感,可以忽略并继续进行第2点修复。请欣赏输入,但由于我没有从用户处获取文本,我相信我不必担心SQL注入。@EGHDK:SQL注入不仅仅是因为用户输入,如果该键已存储了任何特殊字符,则可能会出现这种情况。如果您对该问题不太敏感,可以忽略并继续使用point 2 fix.Perfect。你的第一个建议奏效了。我不知道你使用参数是什么意思。想解释一下吗?我建议将级别参数化以避免SQLinjection@CJBSAndroid数据库API只有字符串参数。完美。你的第一个建议奏效了。我不知道你使用参数是什么意思。想解释一下吗?我建议将级别参数化以避免SQLinjection@CJBSAndroid数据库API只有字符串参数。列名不能用作参数。CL和Vyrx均为+1。我不会为列名使用占位符,但一般来说,我也发现使用API的这一部分比使用rawQuery更可取。列名不能用作参数。CL和Vyrx都使用+1。我不会为列名使用占位符,但总的来说,我还发现使用API的这一部分比使用rawQuery更可取。