2011-06-13 2 views
21

나는 다음과 같은 DB 헬퍼 클래스가 있습니다SQLite는 예외 선택하려고 그런 열

public int studentExists(String studid) { 
    Cursor dataCount = mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=" + studid, null); 
    dataCount.moveToFirst(); 
    int count = dataCount.getInt(0); 
    dataCount.close(); 
    return count; 
} 

나는 학생 ID가 이전에 입력되어 있는지 확인하기 위해 내 응용 프로그램이 사용합니다.

학생 ID가 int 일 때 제대로 작동하지만 (346742) 영숫자 ID (PB3874)를 추가 할 때마다 앱이 강제 종료됩니다.

오류 :

private static final String DATABASE_CREATE = 
    "create table usertable (_id integer primary key autoincrement, " 
    + "studid text not null);"; 

그러나 오류가 no such column: pb3874 말을 왜 내가 혼란 스러워요 : (I 텍스트 형식을 사용하기 때문에)

06-13 18:22:20.554: ERROR/AndroidRuntime(8088): android.database.sqlite.SQLiteException: no such column: pb3874: , while compiling: select count(*) from usertable where studid=pb3874

내가 그에게 데이터 형식의 문제를 생각하지 않는다 나는 단순히 그 칼럼에서 그 가치를 선택하려고 노력하고 있습니다. 또한 왜 이것이 int 값을 위해 완벽하게 작동하는지. 누구든지 문제를 해결하는 데 문제가 있습니까?

+0

가능한 복제 [SQLite는 삽입 문제 - 오류 : 그런 칼럼] (https://stackoverflow.com/questions/21958789/sqlite-insert-issue-error-no-such-column) – Veve

답변

53

SQLite는 'pb3874'가 실제로 문자열/텍스트 리터럴이 아닌 열 이름이라고 생각합니다.

당신이 당신의 텍스트 값이 적절한 따옴표에 싸여 수 있도록 할 것입니다, 그것은 텍스트 문자의 지정하려면 :

은 SQL 주입 공격을 방지하기 위해, 당신은 사용자의 입력을 복용 할 때마다 사용 매개 변수가있는 쿼리 (사용자 입력을 촬영할 때 매우 낙담) 파라미터없이

("select count(*) from usertable where " + KEY_STUDID + "=?", studid); 

:

("select count(*) from usertable where " + KEY_STUDID + "='" + studid + "'", null); 

이유 당신의 숫자 발 ues가 이것을 생성하지 못했습니다 : SQLite가 당신을 위해 숫자 리터럴을 변환했습니다.

+1

감사합니다. 귀하의 답변을 통해 문제를 디버깅하는 데 도움이되었습니다. 문자열에 작은 따옴표를 포함하는 것을 잊었으며 동일한 SQLiteException을 얻었습니다. – webgenius

+0

@webgenius, 그게 정말 유용한 answer.thanks –

+0

@ p.campbell 고마워 많이 – PN10

5

SQL 문자열에 포함 시키려면 'pb3874'(작은 따옴표)를 인용해야합니다.

2

나는 당신이, 당신이 이런 식으로 그것을 할, 내가 제안, 제대로 쿼리의 형식을 Antlersoft 또는 p.campbell에서 뭐가 잘못 됐는지에 대한 답을 찾은 것 같아 :

mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=?", studid); 

(1) 해결해야한다는 당신의 문제는 (2) SQL 주입

또한

로부터 사용자를 보호, 나는

dataCount.getInt(0); 

은 ... 당신은 아마에 getColumnIndex를 사용해야 할 수있는 최선의 일은하지 있는지입니다 STRING에 대한

+0

+1 동의했다.Matt 감사합니다. 나는이 페이지에 대한 미래의 안드로이드 SQLite 방문자가 SQL 주입 방지의 이점을 얻을 수 있기를 희망하면서 파라메타 화를 내 대답에 뻔뻔하게 추가 할 것이다. 감사! –

0

당신 '('sasas ')'사이를에 배치해야합니다 ... 당신이 바로 데이터를 받고 있는지 확인

select * from bio where email = 'sasas'