2011-07-04 4 views
0

내가SimpleCursorAdapter 올바른 값을 반환하면서 실패로

SimpleCursorAdapter 

의 사용과 오랜 시간의 한 지점, 즉에 부착되어 사용하기 어려운되고 있습니다. 나는 오히려 내가에서 onCreate (..)에서

db.rawQuery(String,String) 

내 코드를 어떻게해야 내가 커서 데이터베이스 쿼리에 _id 컬럼을 추가해야한다는, SO 자체가 유사한 많은 게시물을 볼

HospitalData = new Database(this); 
HospitalData.open(); 
Cursor c = HospitalData.getAllRows_Patient_Db(); 
startManagingCursor(c); 
c.moveToFirst(); 

//HERE SOME LOOP IS NEEDED FOR TRAVERSING AND PUTTING IN THE LISTVIEW 
while(c.isAfterLast() == false) 
{ 
    String[] columns = new String[] { c.getString(1), c.getString(2) }; 
    int[] to = new int[] { R.id.room_number_db, R.id.pt_initial_db }; 
    adapter = new SimpleCursorAdapter(this,R.layout.patient_db, c,columns,to); 
    c.moveToNext(); 
} 
setListAdapter(adapter); 
입니다했다

을 다음과 같이 KEY_ROWID가 정의

public Cursor getAllRows_Patient_Db() 
{    
    return db.query(DATABASE_PATIENT_TABLE, new String[] {KEY_ROWID, KEY_ROOM_NUMBER,        
                 KEY_PATIENT_INITIAL 
      }, 
      null, 
      null, 
      null, 
      null, 
      null); 
} 

을 다음과 같이

그리고 이전에 내 데이터베이스를 액세스하는 코드였다

public static final String KEY_ROWID = "_id"; 

그리고이 함께 오류가 여기에

07-04 22:10:23.301: ERROR/AndroidRuntime(16795): Caused by: java.lang.IllegalArgumentException: column '90' does not exist 
07-04 22:10:23.301: ERROR/AndroidRuntime(16795):  at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314) 
07-04 22:10:23.301: ERROR/AndroidRuntime(16795):  at android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312) 

열 (90)가 열 ID가 아니라 내 데이터베이스에 따라 cursor.getString (1)에 저장된 데이터입니다,하지만 난 여기가하려고 생각입니다 검색 커서 .getString (0)은 행 ID입니다.

나중에

public Cursor getAllRows_Patient_Db() 
{ 
    String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" + 
    ",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE"; 

    return db.rawQuery(db_sel,null); 
} 

를 다음과 같이 내 코드를 변경하지만 아직도 내가 오류가 발생하고,이 시간 오류가 도와주세요, 나는 아주 긴 시간에서 함께 붙어 있어요

07-04 21:36:12.510: ERROR/global(9861): Deprecated Thread methods are not supported. 

07-04 21:36:12.950: ERROR/AndroidRuntime(9861): FATAL EXCEPTION: main 
07-04 21:36:12.950: ERROR/AndroidRuntime(9861): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pro/com.pro.CopyOfFirstScreen}: android.database.sqlite.SQLiteException: no such table: DATABASE_PATIENT_TABLE: , while compiling: SELECT id as _id, KEY_ROOM_NUMBER,KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE 

07-04 21:36:12.950: ERROR/AndroidRuntime(9861): Caused by: android.database.sqlite.SQLiteException: no such table: DATABASE_PATIENT_TABLE: , while compiling: SELECT id as _id, KEY_ROOM_NUMBER,KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE 

다르다! !

편집 : 자 이제 너희들은 내 쿼리 문이 정확하고 주셔서 감사합니다, 나는 내가 데이터베이스 쿼리 구문을 이해하는 좋은하지 않다 죄송하지만

작업 쿼리 후를 배우려고 노력하고 도움을 변경

String db_sel = "SELECT _id as _id, room_number" +",patient_initial FROM " + DATABASE_PATIENT_TABLE; 

는 사실 내가 키 값

public static final String KEY_ROWID = "_id"; 
public static final String KEY_ROOM_NUMBER = "room_number"; 
public static final String KEY_PATIENT_INITIAL = "patient_initial"; 

하지만 지금이 아닌 또 다른 문제를 참조로 선언 된 문자열을 변경했다입니다 쿼리 문하지만 길에서 내가 액세스하거나 내 표는 2 행과 3 열을 가지고 볼 수 있듯이 simplecursorAdapter

DB Table

를 사용하고, 지금은 2 열 및 3 열에서 데이터를 가져 오려는 내 listview에 넣어. 그러나 쿼리 수정 후 내가 다른 오류를 얻고있다 (SimpleCursorAdapter

은 원래는

String[] columns = new String[] {c.getString(1), c.getString(2) }; 
     int[] to = new int[] { R.id.room_number_db, R.id.pt_initial_db }; 
    adapter = new SimpleCursorAdapter(this,R.layout.patient_db, c,columns,to); 
    c.moveToNext(); 
    setListAdapter(adapter); 

이고 오류가

07-05 21:32:29.228: ERROR/AndroidRuntime(1505): Caused by: java.lang.IllegalArgumentException: column '90' does not exist 
    07-05 21:32:29.228: ERROR/AndroidRuntime(1505):  at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314) 
    07-05 21:32:29.228: ERROR/AndroidRuntime(1505):  at android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312) 

android.widget.SimpleCursorAdapter.findColumns

했다.자바 : 당신이

 int x = 0;   
    String[] columns = new String[] { c.getString(0),c.getString(1), c.getString(2) }; 
     int[] to = new int[] { x, R.id.room_number_db, R.id.pt_initial_db }; 
    adapter = new SimpleCursorAdapter(this,R.layout.patient_db, c,columns,to); 
    c.moveToNext(); 
    setListAdapter(adapter); 

이 단지했다 나는 내 코드에서 변경 한 이후 행

접근의 첫 번째 열 inspite의 데이터에 액세스하려고 볼 수 있듯이 312)

SimpleCursorAdapter이 정상 커서에 비해 작품과 내가 오류가 나는 유을이 질문이 너무 오래 :-(되고 알고

07-05 21:34:47.947: ERROR/AndroidRuntime(1966): Caused by: java.lang.IllegalArgumentException: column '1' does not exist 
07-05 21:34:47.947: ERROR/AndroidRuntime(1966):  at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314) 

얼마나 다르게 찾기 위해 생각 여기에서 몇 가지 코드를 삭제하라고 제안합니다.

android.database.sqlite.SQLiteException: no such table: DATABASE_PATIENT_TABLE: 

:

+0

. 표준 DatabaseHelper를 사용하지 않는 이유가 있습니까? – Estel

+0

데이터베이스를 만들기 위해 DatabaseHelper를 사용했습니다. 이전에 내 질문이 명확하지 않았을 수 있습니다. 나는 내가 전에 얻었던 오류를 추가했다. 그것을보고, 만일 가능하다면 나에게 친절히 안내한다. –

답변

0

문제가 해결되었습니다. 가장 중요한 점은 데이터베이스에 대한 각 쿼리에 대해 항상 _id를 쿼리해야한다는 것입니다. 그러나 커서 .getString (someIndex)로 수행하면 어댑터로 잘못 인식됩니다. 내 경우에는 첫 번째 열의 내용을 rowid로 가져 와서 열을 검색하려고합니다.

Nether가 rawQuery()를 수행하거나 "Select _id as _id"를 필수 항목으로 사용해야합니다. 나는이 느낌이들 때가 이따금 오도 된 것이다.

아래의 내용을 간단하게 유지하는 것이 코드입니다. 데이터베이스 코드

public Cursor getAllRows_Patient_Db() 
{    
    return db.query(DATABASE_PATIENT_TABLE, new String[] { 
      KEY_ROWID, 
      KEY_ROOM_NUMBER, 
      KEY_PATIENT_INITIAL 
      }, 
      null, 
      null, 
      null, 
      null, 
      null); 
} 

활동 코드 안드로이드 데이터베이스 파일을 찾을 수없는 경우이 오류가 자주 발생

HospitalData = new Database(this); 
    HospitalData.open(); 
    Cursor c = HospitalData.getAllRows_Patient_Db(); 


    startManagingCursor(c); 

    String[] columns = new String[] {HospitalData.KEY_ROOM_NUMBER,HospitalData.KEY_PATIENT_INITIAL }; 
    int[] to = new int[] { R.id.room_number_db, R.id.pt_initial_db }; 
    adapter = new SimpleCursorAdapter(this,R.layout.patient_db, c,columns,to); 
    c.moveToNext(); 
    setListAdapter(adapter); 
2

당신은 오류 스택의이 부분을 읽고? 데이터베이스에 이러한 테이블이 없습니다. 그것은 CursorAdapter 문제가 아닙니다. 루프가 완전히 무의미한 것 같습니다. 일부 자바 핸드북을 읽으십시오. 마지막 동안

String[] columns = new String[] { c.getString(1), c.getString(2) }; 

columns[] 당신이 수십를 만드는 당신의 while{} 루프에 열을 이름하지 값 ... 을 포함해야 SimpleCursorAdapters의 (?) : 좋아, 코드에서 몇 가지 문제를 나열 시작할 수 있습니다 에 전달됩니다. 코드의이 부분 :

String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" + 
    ",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE"; 

은 분명히 잘못된 것입니다. 그와

String[] columns = new String[] { c.getString(0),c.getString(1), c.getString(2) }; 
    int[] to = new int[] { x, R.id.room_number_db, R.id.pt_initial_db }; 

:

String[] columns = new String[] { c.getColumnName(1), c.getColumnName(2) }; 
    int[] to = new int[] {R.id.room_number_db, R.id.pt_initial_db }; 
+0

공개 커서에서 변경 한 후에 만이 오류가 발생했습니다. getAllRows_Patient_Db() { 문자열 db_sel = "_id, KEY_ROOM_NUMBER"+ ", KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE"; return db.rawQuery (db_sel, null); } 이전 코드와 완벽하게 잘 작동합니다. –

+0

나는 테이블이 완벽하게 생성된다고 말하고있다. –

+0

내 편집 코드를 보아라. 내가보기에 어디에서 봤는지 알 수없는 오류를 추가했다. 그것은 rowid를 검색하려고 시도하고 있었고, 그 일로 인해 부서졌다. –

2

새로운 오류가 교체

String db_sel = "select id as _id, +"KEY_ROOM_NUMBER+", "+ KEY_PATIENT_INITIAL +" from "+DATABASE_PATIENT_TABLE; 

: 나는 당신이 뭔가 같은

private static String DATABASE_PATIENT_TABLE = "patient"; 

그래서 그냥 그 상수를 사용할 수 있다고 가정 탭이 없다고 말하는 중입니다. le "DATABASE_PATIENT_TABLE"을 데이터베이스에 저장하십시오. 데이터베이스에서 테이블의 이름이 아닌 데이터베이스의 테이블 이름이 들어있는 문자열의 정적 필드 이름 인 것으로 보이는 코드에서.

아래 코드에서 "DATABASE_PATIENT_TABLE"을 데이터베이스의 테이블 이름으로 변경해야합니다.

String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" + 
",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE"; 

이 시도하고 작동되는지 확인 :

String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" + 
",KEY_PATIENT_INITIAL FROM" + DATABASE_PATIENT_TABLE; 

은 원래 오류 같이 SimpleCursorAdapter는 _id의 필드를 포함해야합니다. 커서를 강화하는 SQL Statment에 대한 변경으로 인해 수정되지만 SQL 문에 올바른 테이블 이름이 있는지 확인해야합니다.

희망이 도움이됩니다.

+0

George님께 도움을 주신 것에 감사드립니다. 제발 다른 코드 스 니펫을 추가해주세요. 다시 한 번 감사합니다 –

+0

언제든지. 기쁜 데 도움이되었습니다. –

관련 문제