Android sqlite3 говорит "нет _id", но таблица определенно имеет - PullRequest
2 голосов
/ 01 сентября 2011

Каким-то образом при отладке небольшого Android-приложения, основанного на местоположении, я получаю странное исключение. Посмотрите и поделитесь своими идеями:

Я подключил ListActivity к базе данных sqlite3 через ContentProvider. Теперь всегда, когда я запускаю ListActivity, программа умирает с исключением, сообщающим мне

column '_id' does not exist

(без имени таблицы) для строки, в которой я создаю объект SimpleCursorAdapter для моего ListActivity.

    Cursor cursor = managedQuery(intent.getData(), new String[] {TrackTable.START_LOC, TrackTable.END_LOC}, null, null,
            TrackTable.DEFAULT_SORT_ORDER);
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.gps_track_entry, cursor, new String[] {
                    TrackTable.COLUMN_NAME_TIME_START,
                    TrackTable.COLUMN_NAME_TIME_END
                }, new int[] { R.id.l_start, R.id.l_end });

Моя база данных выглядит так:

sqlite> .tables
.tables
android_metadata ocation track
sqlite> . schema track
.schema track
CREATE TABLE track (
  _id INTEGER PRIMARY KEY,
  start_location INTEGER,
  end_location INTEGER,
  start_time TEXT,
  end_time TEXT
);
sqlite> .schema location
.schema location
CREATE TABLE location (
  _id INTEGER PRIMARY KEY,
  long TEXT,
  lat TEXT,
  alt TEXT,
  accu TEXT,
  bear TEXT,
  sped TEXT,
  time TEXT);
sqlite> .schema android_metadata
.schema android_metadata
CREATE TABLE android_metadata (locale TEXT);

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

1 Ответ

4 голосов
/ 01 сентября 2011

Эрих прямо выше; проблема в том, что ваш запрос SELECT должен включать BaseColumns._ID как часть проекции. Что-то вроде:

Cursor cursor = getContentResolver().query(TrackTable.CONTENT_URI, 
        new String[] { TrackTable._ID, TrackTable.COLUMN_NAME_TIME_START,
        TrackTable.COLUMN_NAME_TIME_END }, null, null, null);

Кстати, см. Javadoc для CursorAdapter :

Курсор должен включать столбец с именем _id, иначе этот класс не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...