我有这个查询,它根据我的应用程序中的表单中传递的一些参数返回一个特定的记录。这是我遇到问题的地方:
String[] args={"act_email,act_password"};
Cursor cursor= db.query(DB_TABLE_NAME,new String[]{"email","password"},"email"+" like" + " %?%"+"AND"+" password "+" like" + " %?%",new String[]{"act_email,act_password"},null,null, null);
以下是我在网上找到的一些代码:
Cursor cursor= db.rawQuery("SELECT email,password FROM users WHERE email LIKE '%' || ? || '%' and password LIKE '%' || ? || '%'",args);
此代码不会导致任何问题,但它确实需要一些优化,主要是因为它总是返回一个空值。关于如何解决这个问题的任何建议?
答案 0 :(得分:3)
为什么你连接那么多?
您的第一个where条件和AND
之间缺少空格。
使用"email like '%?%' AND password like '%?%'"
作为第三个参数。
另外:您确定要接受每个密码输入,这是存储在数据库中的密码的一部分吗?在这种情况下,即使密码是“thejdsfsdaf2313 !!!”,“e”也是一个有效的输入。
答案 1 :(得分:1)
String[] args={"act_email,act_password"};
Cursor cursor= db.query(DB_TABLE_NAME,new String[]{"email","password"},
"email like '%"+args[0]+"%' and password like '%"+args[1]+"%'",args,null,null, null);
答案 2 :(得分:1)
你的args不正确,因为它缺少两个元素之间的引号...你必须在大括号之间有两个单独的字符串。这应该是:
String[] args= {"act_email","act_password"};
修改(开始)
其次,您缺少查询选择字符串中的 '
文本限定符,对于文本字段,这些限定符应为以下格式:
<击>字段= '?'击>
SQLite似乎自己处理引号的句柄,所以你需要做的就是在表单中提供where子句:
field=? [ AND field2=? ... AND fieldn=? ]
然后在args数组中提供参数。似乎Androids OpenDatabaseHelper类根据类型自动处理文本限定符。
修改(结束)
请注意,以这种方式在Android上使用SQLite的参数化查询不喜欢查询字符串中的%
wilcards。要使用通配符,请将它们放在arg值中,这将在执行期间替换。所以你的args成为:
String[] args= {"%act_email%","%act_password%"};
或者如果你想在这里使用变量:
String[] args= {"%" + act_email + "%", "%" + act_password+ "%"};
所以完整的代码应该是这样的:
String[] fields = {"email","password"};
String[] args= {"%" + act_email + "%", "%" + act_password+ "%"};
//do not use like for usr & pwd
String where = "email like ? AND password like ?";
Cursor cursor= db.query(DB_TABLE_NAME, fields , where, args,null, null, null);
虽然我在电子邮件和密码的情况下指出你不应该使用like
。
将where子句更改为:
String where = "email=? AND password =?";//do not use like for usr & pwd
答案 3 :(得分:1)
Cursor cursor1=db.rawQuery("SELECT taskid,taskname,taskdescription,tasktime,issync,userid,taskdate FROM task WHERE taskname like '%"+strTaskName+"%'", null);