2016-10-31 2 views
0

저는이 방법을 간단한 db 검색에 사용하고 있습니다.SQLite rawquery가 예상 한 문자열과 일치하지 않습니다.

Date: 30/10/2016 
Time: 6:56:41 
Category: Food 
Description: Lunch at Nosh 
Amount: 25 

UNC "와 같은 설명을 지정할 때 같은 기록이 나타나지 않는다 그러나 : 더 값이 전달되지 않은 경우

public Cursor queryExpense(String createdDate, String createdTime, String category, String description, String amount) { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + COLUMN_DATE + " LIKE ? AND " + COLUMN_TIME + " LIKE ? AND " + 
      COLUMN_CATEGORY + " LIKE ? AND " + COLUMN_DESCRIPTION + " LIKE ? AND " + COLUMN_AMOUNT + " LIKE ? "; 
    String mDate = createdDate.length() > 0 ? "%" + createdDate + "%" : "%"; 
    String mTime = createdTime.length() > 0 ? "%" + createdTime + "%" : "%"; 
    String mCategory = category.length() > 0 ? "%" + category + "%" : "%"; 
    String mDescription = description.length() > 0 ? "%" + description + "%" : "%"; 
    String mAmount = amount.length() > 0 ? "%" + amount + "%" : "%"; 

    Log.d("Parameters",mDate + "," + mTime + "," + mCategory + "," + mDescription + "," + mAmount); 

    return db.rawQuery(query, new String[] { mDate, mTime, mCategory, mDescription, mAmount }); 
} 
} 

(모든 항목이"% "이다), 그 결과 중 하나는이 기록이다 ". 디버그 로그는 예상 된 매개 변수와 SQL을 보여 주므로 왜 이것이 결과가 아닌지 잘 모르겠습니다.

SELECT * FROM expenses where createdDate like ? and createdTime like ? and category like ? and description like ? and amount like ? 
[%,%,%,%unc%,%] 

내가 무엇이 누락 되었습니까?

편집 : 문제는 검색이 생략되었을 수도있는 결과로 인해 Cursor.moveToFirst 및 Cursor.moveToNext 모두 데 내가 할 문제를 확인했습니다 @laalto하는

감사를 해결 하나의 결과.

+1

끝에서만. 디버그 출력을 설명하지 않습니다. – laalto

+0

Ah 실제로 모든 하위 문자열과 일치합니다. 코드의 각 필드에 대해 앞선 %를 놓쳤습니다. 지금 편집되었습니다. – Jay

+0

@laalto 이상한 일은,이 방법으로 검색 할 때 테이블의 일부 행이 잘됩니다. 어떤 패턴이 보이지는 않지만 특정 행에 대해서만 문제가되는 것으로 보입니다. – Jay

답변

1

질문 주석에 기초 : 쿼리는 정상이며 예상되는 행과 일치합니다.

문제는 반환 된 Cursor을 읽는 중입니다. A와 같은 구조

if (cursor.moveToFirst()) { 
    while (cursor.moveToNext()) { 
     //... 
    } 
} 

보다 구체적인 선택 기준이있는 유일한 반환 된 행은 건너 뜁니다.

될 커서를 통해 반복에 대한

관용적 패턴 : 당신이 정말`일치하는 UNC %`가 아니라`% UNC %`는`%를 추가하고 있기 때문에 '것 같은 코드가 보이는 나에게

if (cursor.moveToFirst()) { 
    do { 
     //... 
    } while (cursor.moveToNext()); 
} 
+0

완벽! 고맙습니다. – Jay

관련 문제