Я застрял в одном месте с давних пор, то есть с использованием
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)
Я знаю, что этот вопрос становится слишком длинным :-( Вы предлагаете мне удалить отсюда какой-то код.