2013-08-27 1 views
0

새로운 계산을 위해 마지막 elemnt를 확인하기 위해 데이터베이스에 액세스하는 알고리즘을 구현해야합니다. 데이터베이스가 비어 있고 내가 그것을 방지하기 위해 cursor.getCount always = 0

IndexOutOfBoundsException) index 0 requested with a size of 0 

를 얻을 수 있기 때문에 물론, 처음이 불가능하다, 나는 cursor.getCount==0 있는지 확인하기 위해 노력하고 나는 기본적으로 첫 번째 요소를 소개합니다. 문제는 데이터베이스에 저장 한 경우에도 이 0 인 상태로 유지된다는 것입니다. 내 방법의 코드는 다음과 같습니다.

public Measures getLastMeasure(String date) { 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLE_MEASURES, new String[] { KEY_ID, 
      KEY_DATE, KEY_TIME_HOUR, KEY_TIME_MINUTE, KEY_BE_INTAKE, 
      KEY_GLUCOSE, KEY_BOLUS, KEY_BASAL }, KEY_DATE + "=?", 
      new String[] { date }, null, null, KEY_TIME_HOUR + " DESC, " 
        + KEY_TIME_MINUTE + " DESC", "1"); 
    if (cursor.getCount() == 0) { 
     Measures m = new Measures("nodate", 0, 0, 0, 0, 0, 0); 
     return m; 
    } else { 
     if (cursor != null) 
      cursor.moveToFirst(); 

     Measures m = new Measures(Long.parseLong(cursor.getString(0)), // id 
       cursor.getString(1), // date 
       Integer.parseInt(cursor.getString(2)), // timeHour 
       Integer.parseInt(cursor.getString(3)), // timeMinute 
       Double.parseDouble(cursor.getString(4)), // BE intake 
       Double.parseDouble(cursor.getString(5)), // glucose 
       Double.parseDouble(cursor.getString(6)), // bolus 
       Double.parseDouble(cursor.getString(7)) // basal 

     ); 
     // return m 
     return m; 
    } 
} 

도와 주시면 감사하겠습니다. 모든 사람에게 미리 감사드립니다.

+1

데이터베이스에 데이터가 있고 커서가 항상 0 행을 반환하는 경우 'KEY_DATE + "=?"필터가 예상 한대로 수행하지 않을 수 있습니다. –

답변

0

나는 뭔가를 놓칠 수 있었지만 그 코드는 나에게 맞았다. 찾으려는 데이터가 실제로 데이터베이스에 있고 getLastMeasure()에 전달하는 인수가 맞는지 확실합니까?

0

검색어와 일치하는 데이터가 검색과 일치하지 않는 것 같습니다. cursor는 (널 Cursor 반환 SQLiteDatabase#query 않음) null없는 경우 확인 필요없이, 어쨌든 수표 쓸모가 : 당신은 단지 날짜를 기준으로 최신 데이터를 원하는 경우에, 나는 order by KEY_DATE desclimit 1, 또는 max(KEY_DATE) 대신 KEY_DATE + "=?"

사이드 노트의 제안 null인데도 cursor에 액세스하고 있습니다. 또한 Cursor을 종료하지 않습니다.

+0

어디서 닫아야합니까? 커서로 작업하는 것은 처음입니다 ... – JP88

+0

그런데 max() 메서드가 존재하지 않습니다. – JP88

+0

메서드에서 복귀하기 전에 커서를 닫습니다. 이것이 내가 이런 종류의 방법으로 단 하나의 수익을 얻는 것을 선호하는 이유이기도합니다. 하나의 return 문만 사용하여 동일한 동작을 수행하도록 코드를 수정할 수 있습니다 (일반적으로 하나의 return 문을 사용하면 종료 점이 하나이므로 메서드를 더 쉽게 읽을 수 있습니다). 내 말은 [SQLite max() function] (http://www.sqlite.org/lang_corefunc.html)입니다. – m0skit0