Простая проблема с адаптером курсора - PullRequest
1 голос
/ 12 июля 2011

Вот мой код для простого адаптера курсора.

public class CursorList extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    DatabaseAdapter da = new DatabaseAdapter(this, "mydb.sqlite");

    da.open();
    Cursor cur = da.fetchAllRecords("Doctors", new String[]{"FirstName"});
    startManagingCursor(cur);

    cur.moveToFirst();
    do {
        Log.v("Info", cur.getString(cur.getColumnIndex("FirstName")));
    } while(cur.moveToNext());

    cur.moveToFirst();

    String[] from = new String[]{"FirstName"};
    int[] to = new int[]{R.id.row};

    SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.row_item, cur, from, to);

    setListAdapter(sca);
    }
}

Записи данных отображаются корректно в журнале, но код перестает работать, когда достигает значения

SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.row_item, cur, from, to);

line.

Я получаю ошибку:

ERROR/AndroidRuntime(26746): Uncaught handler: thread main exiting due to uncaught exception
ERROR/AndroidRuntime(26746): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.arnab.cursorlist/com.arnab.cursorlist.CursorList}:
java.lang.IllegalArgumentException: column '_id' does not exist

Куда я иду не так?

Почему выдает ошибку, что столбец '_id' не существует?Это необходимый столбец, который мы должны иметь в наших таблицах?

EDIT:

Когда я помещаю связанный с курсором код в блок try catch, что-то вроде этого:

try {
        SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.row_item, cur, from, to);

        setListAdapter(sca);
    }
    catch(Exception E) {
        Log.v("Error", E.getMessage());
    }

Я получаю сообщение:

VERBOSE/Error(1026): column '_id' does not exist

@ Rasel: Вот метод fetchAllRecords

public Cursor fetchAllRecords(String table, String columns[]) {
    return mDb.query(table, columns, null, null, null, null, null);     
}

Ответы [ 3 ]

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

Почему выдается ошибка, что столбец '_id' не существует? Это необходимый столбец, который мы должны иметь в наших таблицах?

Да, если вы хотите использовать информацию вашей базы данных в адаптере курсора. Адаптер использует его для внутренних целей. В вашей таблице должен быть столбец «_id», и вы должны выбрать его в своем запросе (поэтому он находится в наборе результатов Cursor). Вам не обязательно отображать его в вашем ListView.

Пересмотрено для потомства

Вместо фактического добавления столбца «_id», вы можете SELECT свой собственный столбец «id» как «_id», и он будет работать точно так же.

0 голосов
/ 12 июля 2011

Вам необходимо включить таблицу _id в проекцию.адаптеру курсора списка необходим _id для отслеживания строк.вам не нужно отображать его где-либо или использовать, но курсор должен содержать этот столбец.также столбец первичного ключа с именем _id является обязательным в каждой таблице Android.

0 голосов
/ 12 июля 2011

Напишите код, связанный с курсором, в блоке try catch. Ваша проблема будет решена. Проверьте, когда при создании таблицы вы набрали другой столбец, а не '_id'

...