2014-07-04 3 views
0

내 애플 리케이션에서 나는 테이블에서 파일로 스트리밍 데이터를 보내고있는 많은 SQL 쿼리를 가지고있다. 이러한 quesries에서 기본적으로 내 열을 다른 값으로 정렬 한 다음 첫 번째 행의 값을 가져 오는 SQL 커서가 있습니다. 문제는 그 커서가 테이블의 끝에 도달하면 0 값으로 인해 응용 프로그램이 충돌한다는 것입니다.안드로이드 커서 인덱스 바운스

public static String evalLightTable(String filenamePrefix){ 


    String[] lightcolumns = new String[] { KEY_ROWID, KEY_TID, KEY_NAME, KEY_LUXVALUE, KEY_TRANSMITTED}; 
    Cursor elightcursor = myDatabase.query(LIGHT_TABLE, lightcolumns, KEY_TID + "=" + filenamePrefix + " AND " + KEY_TRANSMITTED + "=" + nottransmitted, null, null, null, null);  
    String notTransmitted = ""; 

    int iRowId = elightcursor.getColumnIndex(KEY_ROWID); 

    if (elightcursor != null) { 
     elightcursor.moveToFirst(); 
     String lightRowId = elightcursor.getString(0); 
     return lightRowId; 
    } 
    return null; 
} 

위의 내용은 내가 실행중인 샘플 쿼리입니다. 아래에 적용되는 logCat은 다음과 같습니다.

07-04 13:21:14.697: E/AndroidRuntime(19537): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 

07-04 13:21:14.697: E/AndroidRuntime(19537): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426) 

내 쿼리에서 커서가 뭔가를 찾으면 데이터를 검색하도록 요청합니다. 그렇지 않으면 반드시 충돌이 없어야합니다.

답변

0

커서에 결과 행이 없습니다. 데이터에 액세스하기 전에 moveTo..()이 성공했는지 확인해야합니다.

또한 query()에서 SQLiteDatabase은 null을 반환하지 않으므로 null 검사가 중복됩니다. 이 시도

따라서,

if (elightcursor.moveToFirst()) { 
+0

나는 훨씬 더이 답변을 좋아합니다. 그것은 완벽하게 이해가되었습니다. 고맙습니다 – user3805374

0

if (elightcursor != null) { 
    elightcursor.moveToFirst(); 

교체, 당신은 결과 수를 확인하지 않았다. 변수 iRowId를 제거합니다.

public static String evalLightTable(String filenamePrefix){ 


String[] lightcolumns = new String[] { KEY_ROWID, KEY_TID, KEY_NAME, KEY_LUXVALUE, KEY_TRANSMITTED}; 
Cursor elightcursor = myDatabase.query(LIGHT_TABLE, lightcolumns, KEY_TID + "=" + filenamePrefix + " AND " + KEY_TRANSMITTED + "=" + nottransmitted, null, null, null, null);  
String notTransmitted = ""; 


if (elightcursor != null && elightcursor.getCount() > 0) { 
    elightcursor.moveToFirst(); 
    String lightRowId = elightcursor.getString(0); 
    return lightRowId; 
} 
return null; 

}