2011-08-24 207 views
1

我有这个查询返回基于在我的应用程序中的窗体内传递的一些参数的特定记录。这是我得到的问题:SQLite查询不断崩溃

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

http://stackoverflow.com/questions/3489045/sqlite-like-alternative-for-regexp-match-start-of-any-word –

+0

我发布了一个更新的答案。 – Merlin

+0

好吧,我其实在我自己的应用程序中试过这个,发现文本限定符似乎是自动处理的,我更新了我的答案以反映我的经验,并指出了一个可行的解决方案,请阅读我的答案并接受如果这能解决您的问题。这将帮助他人阅读这个问题。 – Merlin

回答

1

你的ARG游戏不正确,因为它缺少两个元素之间的引号......你必须有大括号之间的2个独立的字符串。这应该阅读:

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

编辑(开始)

其次你缺少你的查询选择字符串的 '文本识别符,对于文本字段,这些应该是这样的形式:

field ='?'

SQLite的似乎是自行处理的处理报价,因此,所有你需要做的提供形式的where子句:

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

,然后在args数组提供参数。 Androids OpenDatabaseHelper类似乎根据类型自动处理文本限定符。

编辑(完)

请注意,以这种方式在Android上使用SQLite的不喜欢的查询字符串% wilcards是参数化查询。要使用通配符将它们放入参数值中,并在执行过程中替换它。所以,你的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); 

虽然我shoulld指出在电子邮件和密码的情况下,您不应使用like

更改条款的地方:

String where = "email=? AND password =?";//do not use like for usr & pwd 
3

为什么要连接那么多?

您的第一个条件与AND之间缺少空格。

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

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

+0

谢谢,你说得对。更正它。 – Zento

+0

尝试过..相同的结果..感谢您的回复 – ewom2468

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

谢谢..即使崩溃虽然 – ewom2468

1

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

Cursor cursor1=db.rawQuery("SELECT taskid,taskname,taskdescription,tasktime,issync,userid,taskdate FROM task WHERE taskname like '%"+strTaskName+"%'", null);