SQLiteException:编译时没有这样的列:

时间:2015-09-04 10:13:54

标签: android sqlite

这是我的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) ;
  }

2 个答案:

答案 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;