我试图在我的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
答案 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 +“'”