2013-08-10 8 views
5

데이터베이스가 비어 있지 않은 경우에도 커서는 항상 null을 반환합니다. 왜? 어떻게 해결할 수 있을까요? 고맙습니다.Android : 데이터베이스가 비어 있지 않은 경우에도 커서는 항상 null을 반환합니다.

public StatParcours getOneUserInfo(int id) { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.query(TABLE_USER, new String[] { KEY_USER_ID, 
      KEY_STUDN , KEY_STUDBD, KEY_TEACHN, KEY_TEACHBD}, KEY_USER_ID + "=?", 
      new String[] { String.valueOf(id) }, null, null, null, null); 

    StatParcours stat = null; 
    if ((cursor!= null)&&(cursor.moveToFirst())){  
     stat = new StatParcours(
      Integer.parseInt(cursor.getString(0)), 
      cursor.getString(1), 
      cursor.getString(2), 
      cursor.getString(3), 
      cursor.getString(4)); 
    } 
    return stat ; 
}  
+0

커서가 null입니까? 아마 그것은 단지 어떤 행도 가지고 있지 않습니까? 당신이 만든 쿼리가 적어도 하나의 결과를 반환하는지 확인 했습니까? – Karakuri

+0

예,이 메서드를 호출 할 때 Stat의 표시된 값보다 Log를 사용하여 데이터베이스 내용을 검사했습니다. 마녀는 항상 null입니다. 커서가 항상 null임을 이해했습니다. – user2613911

+0

'Log.d ("Foo", "Cursor is :"+ 커서);'그 파일이'Cursor is : null'입니까? 그것이'null'을 출력하지 않으면 커서는 비어 있습니다. 비어 있음은 쿼리가 조건과 일치하는 0 개의 요소를 찾았으며 쿼리가 잘못되었는지 확인해야 할 수도 있음을 의미합니다. – zapl

답변

0

커서가 null이거나 아닌지 확인하고, 그렇지 않은 경우 cursor.getCount()가 0이 아닌지 확인해야합니다.

if (cursor!= null && cursor.getCount() > 0 && cursor.moveToFirst()){ 
    //do something 
} 

커서가 null 또는 cursor.getCount 경우는()는 0이지만, 데이터베이스가 존재하고이 정확한지, 당신은 당신의 SQL을 감지하고이 문제를 해결하기 위해 터미널 또는 SQL 클라이언트에서 명령을 실행해야합니다.

+0

This didn 터미널을 사용하여 문제를 해결하는 방법 – user2613911

+0

'null '을 검사 할 필요가 없으며'getCount'와'moveToFirst' 검사가 중복됩니다 –

+0

사람들은 cursor == null에 대한 검사를 계속하고 있는데, 그 이유는 cursor *가 null 인 경우에'query'가 예외를 던져서 검사를받지 않기 때문입니다. –

2

사용자 ID가 문자열 값과 비교됩니다. 사용자 ID가 숫자 인 경우 성공하지 못합니다.

Android에서는 문자열 값에 대해서만 검색어 매개 변수를 사용해야합니다. 당신은 쿼리 문자열에 직접 정수를 포함한다 :

cursor = db.query(..., ..., KEY_USER_ID + "=" + id, null, ...); 
0

CursorFactory 값을 데이터베이스가 null해야 만들 때 특정 요구 사항이없는 경우.

그래서이 문제를 해결했습니다.

관련 문제