SimpleCursorAdapter сложно использовать

Я застрял в одном месте с давних пор, то есть с использованием

 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

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

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

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

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.

Таблица БД

Как вы можете видеть, моя таблица имеет 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)

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


person Shaista Naaz    schedule 04.07.2011    source источник
comment
Эта ошибка часто возникает, если Android не может найти файл базы данных. Есть ли причина, по которой вы не используете канонический DatabaseHelper?   -  person Estel    schedule 04.07.2011
comment
Я использовал DatabaseHelper для создания своей базы данных, возможно, мой вопрос раньше не был ясен. Я добавил ошибку, которую я получал раньше, пожалуйста, посмотрите на нее и, если возможно, помогите мне.   -  person Shaista Naaz    schedule 04.07.2011


Ответы (3)


Новая ошибка говорит о том, что в вашей базе данных нет таблицы «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.

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

person George Baker    schedule 04.07.2011
comment
Спасибо, Джордж за вашу помощь, пожалуйста, посмотрите мой другой добавленный фрагмент кода. еще раз спасибо - person Shaista Naaz; 05.07.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{} вы создаете десятки (?) SimpleCursorAdapter, в то время как передается только последний. Эта часть кода:

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 };
person piotrpo    schedule 04.07.2011
comment
Эту ошибку я получаю только после внесения изменений в общедоступный курсор getAllRows_Patient_Db() { String db_sel = SELECT id as _id, KEY_ROOM_NUMBER +, KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE; вернуть db.rawQuery(db_sel,null); } с предыдущим кодом работает отлично. - person Shaista Naaz; 04.07.2011
comment
Я имею в виду, что таблица генерируется идеально - person Shaista Naaz; 04.07.2011
comment
Пожалуйста, посмотрите мой код редактирования. Я добавил ошибку, которую я получал раньше, где похоже, что он пытался найти rowid и из-за этого вылетал. - person Shaista Naaz; 04.07.2011
comment
+1 за вашу помощь, я плохо понимаю оператор запроса, я очень стараюсь их понять, и что эта ошибка исправлена, но моя проблема с SimpleCursorAdapter еще не исправлена. Я добавил свой подробный сценарий. Пожалуйста, дайте мне знать, где я делаю неправильно. Спасибо - person Shaista Naaz; 05.07.2011
comment
Решение выше. Пожалуйста, прочитайте книгу о программировании, если у вас есть проблемы с основами. - person piotrpo; 05.07.2011
comment
Уважаемый Piotpro: чтобы сказать вам, что это был мой код раньше, я изменил его и просто тестировал, и я получаю сообщение об ошибке, поэтому я внес изменения. И спасибо за такую ​​помощь. - person Shaista Naaz; 05.07.2011
comment
Я не понимаю, почему люди начинают отвечать, не прочитав сначала вопрос, и начинают давать такие грубые предложения. - person Shaista Naaz; 05.07.2011
comment
Уважаемый Shaista - у вас есть простое и готовое к использованию решение выше, объясняющее, что вам нужно заменить в вашем коде. Может быть, вам следует прочитать ответ, прежде чем подчиняться грубости. С другой стороны, ваш код доказывает, что вам не хватает базовых знаний. - person piotrpo; 05.07.2011
comment
Ах... теперь я поместил свой код в редактирование, то есть помимо объяснения. Я вставил туда свой код, вы увидите тот простой и готовый к использованию код, который я уже использовал раньше, и я получал сообщение об ошибке. Определенно, я делаю что-то не так, и поэтому мой вопрос здесь, но это не то, на что вы указываете, неоднократно указывая на мои основы. - person Shaista Naaz; 05.07.2011

Проблема устранена, главное, чтобы я всегда запрашивал _id при каждом запросе к базе данных, но если я делаю это с помощью cursor.getString(someIndex), то это вводит в заблуждение, поскольку адаптер в моем случае принимая содержимое первого столбца в качестве идентификатора строки и пытаясь найти строку.

Ни выполнение rawQuery(), ни использование «Выбрать _id как _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);
person Shaista Naaz    schedule 05.07.2011