안드로이드에서 DB 작업을 하다보면 다음과 같은 에러를 만날 때가 있다.
"android.database.
CursorIndexOutOfBoundsException:
Index -1 requested, with a size of ..."
이 에러는 DB에서 SELECT한 결과를 Cursor로 받는데 이때 Cursor의 위치가 첫번째 항목 바로 앞(index가 -1인) 위치에 놓이게 된다.
이때 다음 명령을 실행하면
cursor.getString(cursor.getColumnIndex("name"));
android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1과 같은 에러가 발생한다.
왜냐하면 cursor의 위치가 before the first entry이기 때문이다. 즉 cursor의 index가 첫 번째 데이터 바로 앞인 -1의 위치에 있기 때문이다.
이건 다음 둘 중 한 방법으로 처리 해야한다.
1) cursor.moveToFirst()를 cursor.getString() 이전에 실행해서 index가 -1인 (첫 번째 항목 바로 앞) 위치에서 첫 번째 항목으로 이동시킨 후
cursor.getString(cursor.getColumnIndex("name"));
과 같은 명령을 통해 원하는 데이터를 추출하면 된다.
2) while문을 이용해서 cursor.moveToNext()를 이용해서 하면 moveToFirst()를 안 해도 된다.
이때 movetToFirst()를 실행하면 맨 첫번째 데이터를 놓치고 넘어가게 된다.
while(cursor.moveToNext()) {...}를 하면 index -1에서 cursor.moveToNext()로 인해
첫 번째 데이터 위치로 index가 옮겨가게 되므로 굳이 moveToFirst()가 필요 없게 된다.
while(cursor.moveToNext()) {
name = cursor.getString(cursor.getColumnIndex("name"));
}
아래는 코드 조각이다.
DBHelper db_Helper = new DBHelper(mContext);
SQLiteDatabase db = db_Helper.getReadableDatabase();
String sql = "SELECT * FROM "+mContext.getString(R.string.memberTable)
+" WHERE "+mContext.getString(R.string.pinNum)+"='"+pin_num+"';";
//A Cursor object, which is positioned before the first entry.
Cursor cursor = db.rawQuery(sql, null);
//cursor.moveToFirst();
if (cursor.getCount() > 0) {
while(cursor.moveToNext()) {
name = cursor.getString(cursor.getColumnIndex("name"));
}
}
db_Helper.close();
'Android' 카테고리의 다른 글
안드로이드 타이틀바 없애고 전체화면, 화면 가로로(혹은 세로로) 고정하는 법 (0) | 2015.11.16 |
---|---|
안드로이드 xml에 공백 및 특수 문자 넣기 (0) | 2015.11.10 |
안드로이드 전화번호 입력시 자동으로 dash(-) 붙이기 (0) | 2015.11.05 |
callback 메소드가 있는 클래스의 객체 선언 법 (0) | 2015.11.04 |
한 프로그램에 여러 Activity가 있을 때 처음 실행되는 Activity 지정하는 법 (0) | 2015.11.04 |