2010-07-29 7 views
1

안드로이드 애플리케이션에서 SQLite 데이터베이스 개체 형식을 얻으 려합니다. 연락처를 데이터베이스에 추가하고 ID로 찾기를 시도하면 객체를 반환하기 때문에 연락처가 데이터베이스에 있다는 것을 알고 있습니다. 성과 이름으로 찾기를 시도하면 예외가 발생하고 Im은 null 참조로 남습니다. 검색어는 다음과 같습니다.안드로이드에서 SQLite 쿼리 예외 발생

cursor = mDb.query(DB_CONTACTS_NAME, 
    new String[] {KEY_ID, KEY_LAST_NAME, KEY_FIRST_NAME, KEY_EMAIL_ADDRESS, 
       KEY_ORGANIZATION_NAME, KEY_LABEL, KEY_LABEL_POSITION}, 
    KEY_FIRST_NAME + "=" + first + " AND " + KEY_LAST_NAME + "=" + last, 
    null, null, null, null 
); 

Ive도 이름과 성으로 찾으려고했습니다. 상기와 같은 결과.

편집 : 예외는 SQLite는 예외

no such column: aurelius: , while compiling: SELECT _id, last_name, first_name, 
email_address, organization_name, label, label_position FROM contacts WHERE 
first_name=marcus AND last_name=aurelius 

입니다 또한

no such column: marcus: , while compiling: SELECT _id, last_name, first_name, 
email_address, organization_name, label, label_position FROM contacts WHERE 
first_name=marcus 
+0

예외 유형 및 메시지 란 무엇입니까? – Akusete

+0

Alrighty, 그것에 대해 명확히하기 위해 질문을 편집했습니다. 사전에 도움을 주셔서 감사합니다. –

답변

3

당신은 리터럴 문자열을 인용 할 필요가 단지 첫 번째를 선택하려고 또는 이름 때 발생합니다. 이 작업을해야합니다 :

cursor = mDb.query(DB_CONTACTS_NAME, 
    new String[] {KEY_ID, KEY_LAST_NAME, KEY_FIRST_NAME, KEY_EMAIL_ADDRESS, 
       KEY_ORGANIZATION_NAME, KEY_LABEL, KEY_LABEL_POSITION}, 
    KEY_FIRST_NAME + "='" + first + "' AND " + KEY_LAST_NAME + "='" + last + "'", 
    null, null, null, null 
); 

그렇지 않은 경우는 그것이 '마커스'테이블 이름 또는 변수 아니라는 것을 알고 기대하지 수있는 SQL 인터프리터 페이지의

first_name=marcus 

.

참고로 "Billy" ")의 성을 검색해보십시오. 드롭 테이블 연락처"

DO NOT CONSTRUCT SQL QUERIES FROM DATA STRINGS

대신 인수 목록에 걸리는 쿼리를 사용합니다. 문서에서 다음을 검색하십시오.

String[] myArguments = new String[] {first, last}; 
cursor = mDb.query("SELECT * FROM contacts WHERE first_name = ? AND last_name = ?;", myArguments); 

이것은 훨씬 안전합니다. 귀하의 버전에서 '첫 번째'또는 '마지막'변수에 SQLite가 명령으로 해석하는 제어 문자가 포함되어 있으면 데이터베이스 시스템이 손상 될 수 있습니다. DO NOT DO IT ... EVER

+1

당신은 정확합니다. 나는 내가 그 코믹을 잠시 후에 읽은 후에 그 실수를 할 사람이 될 줄은 몰랐다. 그러나 아아, 나는 그렇게했다. –

0

네, 답입니다! 나는 이것을 투표 할 점이 있었으면 좋겠다! 특히,이 절의 문자열이 그들 주위에 작은 따옴표가합니다 :

KEY_FIRST_NAME + "= '"+ 첫번째 + "'및 '+ KEY_LAST_NAME +"=' "+ 마지막 +" ' "