2012-10-30 2 views
0

응용 프로그램 및 컴파일러 오류를 표시합니다. 나는 무슨 일이 일어 났는지 모른다. 클릭 후 데이터베이스에서 임의의 레코드를 검색하고 표시하려고합니다. 나는 Android SQLite Database Tutorial에서와 stackoverflov 오류에서 자습서를 사용 :SQLite 데이터베이스에 문제가 있습니다.

10-30 19:19:59.533: E/AndroidRuntime(359): FATAL EXCEPTION: main 
10-30 19:19:59.533: E/AndroidRuntime(359): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
10-30 19:19:59.533: E/AndroidRuntime(359): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580) 

내 코드입니다 : 내가 잘못 뭐하는 거지

public class PrzyslowiaArabskie { 

    private static final String TABLE_NAME = "tabela_przyslowia"; 
    private static final String DATABASE_NAME = "przyslowiadb"; 
    private static final int DATABASE_VERSION = 1; 
    public static final String KEY_ID = "id"; 
    public static final String KEY_PRZYSLOWIE = "przyslowie"; 

    private DbHelper myHelper; 
    private final Context myContext; 
    private SQLiteDatabase myDatabase; 




    private static class DbHelper extends SQLiteOpenHelper { 

     public DbHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      // TODO Auto-generated constructor stub 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      // TODO Auto-generated method stub 
      db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + 
         KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
        KEY_PRZYSLOWIE + " TEXT NOT NULL);"); 


     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // TODO Auto-generated method stub 
      db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
      onCreate(db); 
     } 

    } 
    public PrzyslowiaArabskie(Context c) { 
     myContext = c; 
    } 
    public PrzyslowiaArabskie open() { 
     myHelper = new DbHelper(myContext); 
     myDatabase = myHelper.getWritableDatabase(); 
     return this; 
    } 
    public void close() { 
     myHelper.close(); 
    } 


    public String getData() { 
     // TODO Auto-generated method stub 
     String[] columns = new String[] { KEY_ID, KEY_PRZYSLOWIE }; 
     Cursor c = myDatabase.query(TABLE_NAME, columns, KEY_ID + "=?", new String[] {String.valueOf(KEY_ID + 1)}, null, null, null); 
     if (c != null) { 
      c.moveToFirst(); 
      String data = c.getString(1); 
      return data; 
     } 
     return null; 
    } 


} 

?

나는 내 문제를 해결했다. 데이터베이스에서 임의의 레코드를 가져 오는 대신 3 개의 버튼 (다음 레코드, 이전 레코드 및 쇼 레코드)을 만듭니다. 이 지침을 사용합니다. Getting the next record into view from database 도움 주셔서 감사합니다.

+1

이 일이 확인 널 시도 여부 확인의 0' – keyser

+0

의 크기와 인덱스 0 요청이,'인덱스 0 0 '의 크기, 요청은 (커서가 비어있는 것을 의미한다 'null'이 아님). 따라서 특정 id + 1 행은 없습니다.이 오류는 _ 수신자가이 오류를 ^습니다. 이미이 오류를 방지하는 방법에 대한 많은 제안 사항이 있습니다. – Sam

답변

2

을보십시오. 대신

if (c != null) { 
    c.moveToFirst(); // This needs to check for validity 
    String data = c.getString(1); // Before indexing into a non-existent record 
    return data; 
} 

...

if(c.moveToFirst()){ 
    String data = c.getString(1); 
    return data; 
} 
물론

당신이 잠시 동안 루프를 고려하는 것이 좋습니다 여러 행을 반복하려는 경우와 while(c.moveToNext()) ...

편집를 사용하여 : 확장 답을 의견을 말하기.

while 루프를 사용하여 커서를 통해 사용할 수있는 모든 레코드를 반복하고 소비자 코드에서 데이터를 활용하려면 단일 문자열 대신 정렬 모음을 반환하도록 메소드 서명을 변경해야합니다. 제공

public ArrayList<String> getData() { 
    ArrayList<String> data = new ArrayList<String>(); 
    String[] columns = new String[] { KEY_ID, KEY_PRZYSLOWIE }; 
    Cursor c = myDatabase.query(TABLE_NAME, columns, KEY_ID + "=?", new String[] {String.valueOf(KEY_ID + 1)}, null, null, null); 
    while(null != c && c.moveToNext()) { 
     data.add(c.getString(1)); 
    } 
    return data; 
} 

예제 코드는 당신이 원하는하지만 결과를 얻을해야 당신이 거래에 관하여에 Java documentation for some information 이상의 추상적 인 프로그래밍 정보를 문의하는 것이 당신은 객체의 컬렉션 처리에 대한 자세한 설명이 필요하고 루프 동안 내가 제안하는 경우 데이터 구조 및 제어 흐름.

+0

while 루프를 사용하는 방법?내가 만들고 코드가 작동하지 않습니다 public String getData() { \t \t // TODO 자동 생성 된 메서드 스텁 \t \t String [] columns = new String [] {KEY_ID, KEY_PRZYSLOWIE}; \t \t 커서 c = myDatabase.query (TABLE_NAME, columns, KEY_ID + "=?", 새 문자열 [] {String.valueOf (KEY_ID + 1)}, null, null, null); \t \t 경우 (c = NULL && c.moveToFirst (!)) { \t \t \t \t \t { \t 문자열 데이터를 어떻게 = c.getString (c.getColumnIndexOrThrow (KEY_PRZYSLOWIE)); \t \t \t return data; \t \t \t} while (c.moveToNext()); \t \t \t \t \t} \t \t는 null; – Tomeksss

+0

@Tomeksss 귀하의 의견을 해결하기 위해 제 답변을 업데이트했습니다. –

+0

도움에 감사드립니다. – Tomeksss

2

커서는 항상 null이 아닙니다. 대신 moveToFirst가 실패합니다.

는 존재하지 않는 커서의 행에 컬럼에 인덱스를 시도하는

if(c.moveToFirst() { 
    String data = c.getString(c.getColumnIndexOrThrow(KEY_PRZYSLOWIE)); 
} 
0

변경

if (c != null) { 

if (c != null && c.moveToFirst()) { 

에 그렇지 않으면 당신은 매칭되는 열이없는 경우에도 커서에서 데이터를 가져 오기 위해 시도합니다.

0

emtpy 커서가있는 것 같습니다. `CursorIndexOutOfBoundsException : 대신이

if(mCursor.getCount > 0) 
{ 
    //do stuff 
} 
관련 문제