1

我有这个查询,它根据我的应用程序的表单中传递的一些参数返回特定记录。这就是我遇到问题的地方:

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

这段代码不会引起任何问题,但它确实需要一些优化,主要是因为它总是返回一个空值。关于如何解决这个问题的任何建议?

4

4 回答 4

3

为什么要串联那么多?

您的第一个 where-condition 和AND.

用作"email like '%?%' AND password like '%?%'"第三个参数。

另外:您确定要接受作为存储在数据库中的密码一部分的每个密码输入吗?在这种情况下,“e”将是一个有效的输入,即使密码是“thejdsfsdaf2313!!!”。

于 2011-08-24T10:34:55.903 回答
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);
于 2011-08-24T10:40:25.573 回答
1

您的参数不正确,因为它缺少两个元素之间的引号......大括号之间必须有 2 个单独的字符串。这应该是:

String[] args= {"act_email","act_password"};

编辑(开始)

其次,您在查询选择字符串中缺少 '文本限定符,对于文本字段,这些应该是以下形式:

字段='?'

SQLite 似乎可以自己处理引号,因此您只需提供以下形式的 where 子句:

field=? [ AND field2=? ... AND fieldn=? ]

然后在 args 数组中提供参数。看来,Android 的 OpenDatabaseHelper 类会根据类型自动处理文本限定符。

编辑(完)

请注意,以这种方式在 Android 上使用 SQLite 的参数化查询不喜欢%查询字符串中的通配符。要使用通配符,请将它们放在 arg 值中,这将在执行期间被替换。所以你的参数变成:

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
于 2011-08-25T09:05:45.160 回答
1

你试过这样吗?我已经举了一个例子。

  Cursor cursor1=db.rawQuery("SELECT taskid,taskname,taskdescription,tasktime,issync,userid,taskdate FROM task WHERE taskname like '%"+strTaskName+"%'", null);
于 2011-08-25T10:38:02.080 回答