2011-08-24 5 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

귀하의 인수가 잘못입니다 ... 당신은 중괄호 사이에 2 개 개의 분리 문자열이 있어야합니다. 이 읽어야합니다

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

편집 (시작)

가 두 번째로 당신이 당신의 쿼리 선택 문자열의 ' 텍스트 한정자를 누락, 텍스트가 다음 양식이어야 필드 :

field = '?' 인수 배열의 매개 변수를 제공 한 후

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

과 :

SQLite는 그래서 당신이해야 할 모든 형태의 where 절을 제공는 자체에 따옴표를 처리 처리하기 위해 나타납니다. Androids OpenDatabaseHelper 클래스는 유형에 따라 텍스트 한정자를 자동으로 처리합니다.

편집 (끝)

쿼리 문자열에 % wilcards을 좋아하지 않아이 방법으로 안드로이드에 SQLite는 사용에 그 매개 변수화 된 쿼리를 유의하시기 바랍니다. 대신 와일드 카드를 사용하려면 arg 값에 넣어야하며 이는 실행 중에 대체됩니다.

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

또는 여기에 변수를 사용하려면 : 그래서 당신의 인수가 될 내가 지적 shoulld 있지만

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

:

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

을 그래서 전체 코드는 다음과 같이 보일 것입니다 이메일과 비밀번호의 경우 like을 사용하지 않아야합니다.

변경 조항에 여기서

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

왜 그렇게 많이 연결 했습니까?

첫 번째 조건과 AND 사이에 공백이 없습니다.

세 번째 인수로 "email like '%?%' AND password like '%?%'"을 사용하십시오.

기타 : 데이터베이스에 저장된 암호의 일부인 모든 암호 입력을 허용 하시겠습니까? 이 경우 "e"는 암호가 "thejdsfsdaf2313 !!!"인 경우에도 유효한 입력이됩니다. 이 두 요소 사이의 인용 부호가 누락으로

+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); 
관련 문제