【问题标题】:SQLite Exception no such column when trying to select尝试选择时SQLite Exception没有这样的列
【发布时间】:2011-06-13 22:47:41
【问题描述】:

我有以下数据库助手类:

public int studentExists(String studid) {
    Cursor dataCount = mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=" + studid, null);
    dataCount.moveToFirst();
    int count = dataCount.getInt(0);
    dataCount.close();
    return count;
}

我在我的应用程序中使用它来查看之前是否输入了学生 ID。

当学生 ID 为整数 (346742) 时,这可以正常工作,但每当我尝试添加字母数字 ID (PB3874) 时,它都会强制关闭应用程序。

错误:

06-13 18:22:20.554: ERROR/AndroidRuntime(8088): android.database.sqlite.SQLiteException: no such column: pb3874: ,编译时: select count(*) from usertable where studid=pb3874

我不认为它是数据类型问题(因为我使用文本类型):

    private static final String DATABASE_CREATE =
    "create table usertable (_id integer primary key autoincrement, "
    + "studid text not null);";

但我很困惑为什么错误说no such column: pb3874,因为我试图简单地从 studid 列中选择该值。以及为什么这对于任何 int 值都非常有效。有人有任何解决问题的建议吗?

【问题讨论】:

标签: android sqlite


【解决方案1】:

这里发生的是 SQLite 认为 'pb3874' 实际上是列名,而不是字符串/文本文字。

要指定它是一个文本文字,您需要确保您的文本值包含在适当的单引号中:

为防止 SQL 注入攻击,每当您从用户那里获取输入时,请使用参数化查询:

("select count(*) from usertable where " + KEY_STUDID + "=?", studid);

没有参数化(在接受用户输入时非常不鼓励):

("select count(*) from usertable where " + KEY_STUDID + "='" + studid + "'", null);  

你的数值没有产生这个的原因:SQLite 为你转换了这些数字文字。

【讨论】:

  • 谢谢,您的回答帮助我调试了一个问题。忘记在字符串中包含单引号并得到相同的 SQLiteException。
  • @p.campbell 非常感谢
  • 非常有用的答案,非常感谢!!
【解决方案2】:

如果您将它包含在 SQL 字符串中,则需要引用 'pb3874'(单引号)。

【讨论】:

    【解决方案3】:

    我想你从 Antlersoft 或 p.campbell 那里得到了问题的答案,为了正确格式化查询,我建议你这样做:

    mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=?", studid);
    

    这应该 (1) 解决您的问题并 (2) 保护您免受 SQL 注入

    另外,我不确定

    dataCount.getInt(0);
    

    是最好的办法...您可能应该使用getColumnIndex 来确保您获得正确的数据...

    【讨论】:

    • +1 同意。谢谢马特。我将无耻地将参数化添加到我的答案中,希望将来访问此页面的 Android SQLite 访问者将受益于 SQL 注入预防。谢谢!
    【解决方案4】:

    对于 STRING,您应该将其放在 '' ('sasas') 之间

    select * from bio where email = 'sasas'
    

    【讨论】:

      【解决方案5】:

      错误是在数据库更新时触发触发器

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        • 2017-02-09
        相关资源
        最近更新 更多