Java Android中SQLite查询引发异常

Java Android中SQLite查询引发异常,java,android,sqlite,Java,Android,Sqlite,我试图在Android应用程序中从SQLite数据库中获取一个对象。我知道联系人在数据库中,因为当我添加它并尝试按ID查找时,它会返回对象。但是,当我尝试按名字和姓氏查找时,它会抛出一个异常,留下一个空引用。以下是查询: cursor = mDb.query(DB_CONTACTS_NAME, new String[] {KEY_ID, KEY_LAST_NAME, KEY_FIRST_NAME, KEY_EMAIL_ADDRESS, KEY_ORGAN

我试图在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

您需要引用文本字符串。这应该起作用:

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”不是表名或变量

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

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

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

这样更安全。在您的版本中,如果“first”或“last”变量包含SQLite解释为命令的控制字符,则可能会破坏数据库系统不要这样做曾经

是的,这就是答案!我希望我有足够的票数来支持这一点!具体来说,WHERE子句的字符串周围必须有单引号:


KEY_FIRST_NAME+“='”+FIRST+“'和“+KEY_LAST_NAME+”='“+LAST+”””

什么是异常类型和消息?好的,刚刚编辑了问题以澄清这一点。谢谢你提前提供的帮助,先生,你说得对。不久前我读了那本漫画之后,我从没想过我会犯这样的错误,但唉,我真的犯了。