【问题标题】:No such column sqlite exception没有这样的列 sqlite 异常
【发布时间】:2014-12-17 19:54:27
【问题描述】:

我正在尝试从用户个人资料中获取一些数据,但找不到该列。我已经检查了每个查询之间的空间,似乎没有错。直到现在我看不到问题,知道吗?之前谢谢 这是我的代码和错误信息

表名

private static final String TABLE_PROFILE = "users"; 
private static final String TABLE_STATUS = "status";

用户列名

//Users column names
private static final String KEY_USER_ID = "user_id";
private static final String KEY_USER_IMG = "picture";
private static final String KEY_USER_EMAIL = "email";
private static final String KEY_USER_NAME = "name";
private static final String KEY_USER_PASSWORD = "password";
private static final String KEY_USER_PHONE = "phone";

状态列名称

//Status column names
private static final String KEY_STATUS_ID = "status_id";
private static final String KEY_STATUS = "status";

表创建语句

 //Users table create statement
private static final String CREATE_TABLE_PROFILE = "CREATE TABLE " + TABLE_PROFILE + 
        "(" + KEY_USER_ID + " INTEGER PRIMARY KEY," + KEY_USER_IMG + " BLOB," + 
        KEY_USER_EMAIL + " VARCHAR," + KEY_USER_NAME + " VARCHAR," + KEY_USER_PASSWORD + " VARCHAR," 
        + KEY_USER_PHONE + " VARCHAR," + KEY_CREATED_AT + " DATETIME," + KEY_STATUS_ID + " INTEGER," 
        + " FOREIGN KEY " + "(" + KEY_STATUS_ID + ")" + " REFERENCES " + TABLE_STATUS + "(" + KEY_STATUS_ID + ")" + ")";

getProfile 方法

public Profile getProfile(String username){
    SQLiteDatabase db = this.getReadableDatabase();
    String selectQuery = "SELECT * FROM " + TABLE_PROFILE + " WHERE " + KEY_USER_EMAIL + " = " + username;
    Log.e(LOG, selectQuery);
    Cursor c = db.rawQuery(selectQuery, null);

    if(c!=null)
        c.moveToFirst();

    Profile pf = new Profile();
    pf.setID(c.getInt(c.getColumnIndex(KEY_USER_ID)));
    pf.setImg(c.getBlob(c.getColumnIndex(KEY_USER_IMG)));
    pf.setEmail(c.getString(c.getColumnIndex(KEY_USER_EMAIL)));
    pf.setName(c.getString(c.getColumnIndex(KEY_USER_NAME)));
    pf.setPassword(c.getString(c.getColumnIndex(KEY_USER_PASSWORD)));
    pf.setPhone(c.getString(c.getColumnIndex(KEY_USER_PHONE)));
    pf.setCreatedAt(c.getString(c.getColumnIndex(KEY_CREATED_AT)));

    return pf;
}

logcat 消息

12-18 02:50:32.616: E/DatabaseHelper(7093): SELECT * FROM users WHERE email = test1
12-18 02:50:32.616: E/SQLiteLog(7093): (1) no such column: test1
12-18 02:50:32.636: E/AndroidRuntime(7093): FATAL EXCEPTION: main
12-18 02:50:32.636: E/AndroidRuntime(7093): android.database.sqlite.SQLiteException: no such column: test1 (code 1): , while compiling: SELECT * FROM users WHERE email = test1

【问题讨论】:

  • 您需要用顶点 (') 将查询内的 username 值括起来,因为它是一个 字符串 值。您的查询必须变为:SELECT * FROM users WHERE email = 'test1'
  • 非常感谢@dergolem,它已经开始工作了
  • 你知道nulldb.rawQuery(selectQuery, null); 中的作用吗?
  • @DerGolem:见xkcd.com/327
  • @njzk2 是的,我知道 SQL 注入。但是:1 - 你的数据库真的对其他应用程序可见吗? 2 - 只是一个简单的例子,更不用说绑定参数(顺便说一句,这对于减少连接也很有好处)。

标签: android sqlite android-sqlite


【解决方案1】:

在 SQL 中,字符串文字必须被引用。

但是,为避免此类格式问题(以及 SQL 注入攻击),请改用 parameters

Cursor c = db.rawQuery("SELECT * FROM " + TABLE_PROFILE +
                       " WHERE " + KEY_USER_EMAIL + " = ?",
                       new String[]{ username });

【讨论】:

    【解决方案2】:

    KEY_USER_EMAIL 列不是字符串类型吗?如果是这种情况,您的 where 子句 WHERE " + KEY_USER_EMAIL + " = " + username 正在尝试将列值引用为 KEY_USER_EMAIL = test1,而它实际上应该引用/使用它,

    KEY_USER_EMAIL = 'test1' 只需将您的 Where 子句更改为这样 -

    SELECT * FROM " + TABLE_PROFILE + " WHERE " + KEY_USER_EMAIL + " = '" + username + "'"
    

    【讨论】:

    • 如果该解决方案有助于解决您手头的问题,请点赞。帮助,其他人快速看到有效的解决方案。
    • 不好的做法,因为容易受到 SQL 注入的影响
    • @omkar.ghaisas 我不能投票,因为我的声誉仍然低于 15 :(
    • Np :) 很高兴看到它对您有所帮助,克服了障碍并继续使用您的其他代码。查看此链接 - stackoverflow.com/questions/9857073/…(赞成的答案)以了解如何实施准备好的语句,而不是当前执行的方式。希望对你有所帮助,进一步。 @njk2 - 我同意,直接将动态变量值添加到 sql 语句中是一个不好的选择,因为它会受到 sql 注入的影响。
    【解决方案3】:

    使用这个

    String selectQuery = "SELECT * FROM " + TABLE_PROFILE + " WHERE " + KEY_USER_EMAIL + " = " + "'" + username + "'";
    

    用户名的值需要作为字符串传递。

    【讨论】:

    • 不好的做法,因为容易受到 SQL 注入的影响
    猜你喜欢
    • 1970-01-01
    • 2015-04-21
    • 2012-04-12
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多