SQLite查询在Android中抛出异常

时间:2010-07-29 02:25:38

标签: 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_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

2 个答案:

答案 0 :(得分:3)

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

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);

这更安全。在您的版本中,如果'first'或'last'变量包含SQLite将其解释为命令的控制字符,那么您可能会破坏数据库系统。 不要做 ... 永远

答案 1 :(得分:0)

是的,这就是答案!我希望我有点投票!具体来说,WHERE子句的字符串必须有单引号:

KEY_FIRST_NAME +“='”+ first +“'AND”+ KEY_LAST_NAME +“='”+ last +“'”