SimpleCursorAdapter сложно использовать - PullRequest
0 голосов
/ 04 июля 2011

Я застрял в одной точке из-за долгого времени, то есть с использованием

 SimpleCursorAdapter 

, так как это не удается при возвращении правильного значения.Я видел много подобных постов в самой SO, в которых говорилось, что я должен добавить столбец _id в запрос к базе данных курсора, а не делать:

 db.rawQuery(String,String)

Мой код в onCreate (..) равен

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);

И ранее мой код доступа к базе данных был следующим:

 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);
}

, где KEY_ROWID определен следующим образом

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 не является идентификатором столбца, но, согласно моей базе данных, это данные, хранящиеся в cursor.getString (1), но я думаю, что здесь он пытается найти cursor.getString (0), который является идентификатором строки.

Позже я изменил свой код следующим образом

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

Я застрял с оченьдолгое время, пожалуйста, помогите !!

РЕДАКТИРОВАТЬ: Хорошо, теперь с вами, ребята, помогите, мой запрос правильно, и спасибо за это, я извиняюсь, я не очень хорошо понимаю синтаксис для запроса к базе данных, но я пытаюсьlearn

Рабочий запрос после изменений:

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";

Но теперь я вижу другую проблему, котораяне из оператора запроса, а из-за того, как я получаю доступ или использую simplecursorAdapter

DB Table

Как видно, в моей таблице 2 строки и 3 столбца. Теперь я хочу получитьданные из столбца 2 и столбца 3 и поместите его в мой список.Но после исправления из запроса я получаю еще одну ошибку

Первоначально это было

   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(SimpleCursorAdapter.java:312)

Как вы можете видеть, он пытается получить доступ к данным первого столбца, несмотря на доступ к строке

После этого я внес изменения в свой код

     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); 

Это было только предположение, чтобы выяснить, как 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)

Я знаю, что этот вопрос становится слишком длинным :-(Вы предлагаете мне удалить некоторый код отсюда.

Ответы [ 3 ]

2 голосов
/ 04 июля 2011

Новая ошибка говорит о том, что в вашей базе данных нет таблицы "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-статут, управляющий курсором, должны исправить это, но вам нужно убедиться, что в операторе SQL указано правильное имя таблицы.

Надеюсь, это поможет.

2 голосов
/ 04 июля 2011

Читали ли вы эту часть стека ошибок:

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

?У вас просто нет такой таблицы в базе данных.Это не проблема CursorAdapter.Ваш цикл кажется совершенно бессмысленным - просто прочитайте руководство по Java.Хорошо, давайте начнем перечислять некоторые проблемы в вашем коде:

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";

явно неверна.Я предполагаю, что у вас есть что-то вроде

private static String DATABASE_PATIENT_TABLE = "patient";

, поэтому просто используйте эти константы:

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 голосов
/ 06 июля 2011

Проблема исправлена, главное, чтобы я всегда запрашивал _id при каждом запросе к базе данных, но если я делаю это с cursor.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);
...