这是我的db帮助程序类,它在第一次安装应用程序时创建数据库。
当我注册一个新用户时,如果他的名字是" john"这样的字母,它会给我一个例外。
但是,像4,56这样的用户名(即:仅数字)没有错误。为什么呢?
class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, "myDB", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d("x", " database CREATED!!! -------------------------");
db.execSQL("create table userData ("
+ "id integer primary key autoincrement,"
+ "name text,"
+ "password text,"
+ "hero int,"
+ "level int,"
+ "loggedin int"
+ ");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
编辑:
这是我实际尝试更新数据库的代码段。
public void login(View v){
//..some code here
db.execSQL("update userData set loggedin=1 where name=" + username2) ;
}
答案 0 :(得分:0)
if his name is letters like "john", it gives me an exception.
However, usernames like 4, 56 (i.e.: digits only) give no errors. Why?
狂野猜测:您忘记将John
括在单引号中,即:'John'
。
原因是John
是一个字符串。
字符串必须用单引号(')
请注意,如果字符串本身包含引号(或撇号),即'I'm aware of that'
,则撇号必须加倍,即'I''m aware of that'
。< / p>
如果您不想使用引号,那么有一种更好的方法可以让Android为您处理:绑定参数。
在实践中,查询中的所有值都应替换为问号占位符(?)。
并为查询提供一个String数组,其中包含要替换的所有值。
通过这种方式,您还可以防止SQL注入。
一个例子可以更好地阐明这个概念:
// Two values to be passed...
final String sql =
"SELECT date, score FROM " + DB_TABLE +
" WHERE strftime('%Y', date) = ? AND " +
"CAST((strftime('%m', date)) AS INTEGER) = ? ORDER BY date DESC";
// ... into the string array parameter of the rawQuery() overload
final Cursor cur =
db.rawQuery
(
sql,
new String[]
{
String.valueOf(CLS_Utils.yearUsing),
String.valueOf(month)
}
);
注意:
同样的技术也适用于execSQL()
因此,它也可以用于INSERT,UPDATE和DELETE。
答案 1 :(得分:0)
sql中的所有字符串都必须用&#39;括起来。引自https://www.sqlite.org/lang_expr.html:
&#34;通过将字符串括在单引号(&#39;)中形成字符串常量。字符串中的单引号可以通过在行中放入两个单引号来编码 - 如Pascal中所示。不支持使用反斜杠字符的C风格转义,因为它们不是标准SQL。&#34;