【问题标题】:SQLite query throwing exception in AndroidAndroid中的SQLite查询抛出异常
【发布时间】:2011-03-22 12:06:28
【问题描述】:

我试图在我的 Android 应用程序中从我的 SQLite 数据库中获取一个对象。我知道联系人在数据库中,因为当我添加它并尝试按 ID 查找时,它会返回对象。但是,当我尝试按名字和姓氏查找时,它会引发异常并且我留下了一个空引用。这是查询:

cursor = mDb.query(DB_CONTACTS_NAME,
    new String[] {KEY_ID, KEY_LAST_NAME, KEY_FIRST_NAME, KEY_EMAIL_ADDRESS,
                 KEY_ORGANIZATION_NAME, KEY_LABEL, KEY_LABEL_POSITION},
    KEY_FIRST_NAME + "=" + first + " AND " + KEY_LAST_NAME + "=" + last,
    null, null, null, null
);

我还尝试仅按名字和姓氏查找。结果和上面一样。

编辑:异常是 SQLite 异常

no such column: aurelius: , while compiling: SELECT _id, last_name, first_name,
email_address, organization_name, label, label_position FROM contacts WHERE
first_name=marcus AND last_name=aurelius

在尝试仅选择名字或姓氏时也会发生

no such column: marcus: , while compiling: SELECT _id, last_name, first_name,
email_address, organization_name, label, label_position FROM contacts WHERE
first_name=marcus

【问题讨论】:

  • 异常类型和消息是什么?
  • 好的,刚刚编辑了问题以澄清这一点。感谢您提前提供任何帮助。

标签: java android sqlite


【解决方案1】:

您需要引用文字字符串。这应该有效:

cursor = mDb.query(DB_CONTACTS_NAME,
    new String[] {KEY_ID, KEY_LAST_NAME, KEY_FIRST_NAME, KEY_EMAIL_ADDRESS,
                 KEY_ORGANIZATION_NAME, KEY_LABEL, KEY_LABEL_POSITION},
    KEY_FIRST_NAME + "='" + first + "' AND " + KEY_LAST_NAME + "='" + last + "'",
    null, null, null, null
);

否则当SQL解释器看到的时候

first_name=marcus

你不能指望它知道 'marcus' 不是表名或变量。

在旁注中尝试搜索姓氏“Billy”“);删除表联系人;”

DO NOT CONSTRUCT SQL QUERIES FROM DATA STRINGS

改为使用接受参数列表的查询。在文档中搜索类似的内容

String[] myArguments = new String[] {first, last};
cursor = mDb.query("SELECT * FROM contacts WHERE first_name = ? AND last_name = ?;", myArguments);

这样更安全。在您的版本中,如果“第一个”或“最后一个”变量包含 SQLite 解释为命令的控制字符,那么您可能会破坏您的数据库系统。 不要这样做 ... 永远

【讨论】:

  • 您说得对。不久前我读了那本漫画后,我从没想过自己会犯这个错误,但是,唉,我做到了。
【解决方案2】:

是的,这就是答案!我希望我有足够的分数来投票!具体来说,WHERE 子句的字符串必须用单引号括起来:

KEY_FIRST_NAME + "='" + first + "' AND " + KEY_LAST_NAME + "='" + last + "'"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多