2012-06-03 1 views
0

я пытался решить вопрос о том, почему я вчера получаю эту ошибку с некоторым кодом:Почему я получаю _id, не существует ошибки при попытке запросить один столбец из таблицы?

java.lang.IllegalArgumentException: column '_id' does not exist 

У меня было намного больше кода, тем более, что мне не нужно, поэтому я раздели много его из чтобы было легче понять, где я ошибаюсь. Но по существу это моя схема:

database.execSQL("CREATE TABLE events (" + 
       "_id INTEGER PRIMARY KEY, event_name TEXT" + 
       ")"); 

Как можно сказать, хорошо выглядит правильно. Если я не забыл прочесть, это, очевидно, там. Но потом я понял, откуда моя ошибка, или, по крайней мере, я уверен, вот почему. Этот код, который извлекает курсор:

public Cursor getEventsName() { 
    return database.rawQuery("SELECT event_name FROM events", null); 
} 

Согласно андроиду, это ошибка. Когда я сменю его на это:

public Cursor getEventsName() { 
    return database.rawQuery("SELECT * FROM events", null); 
} 

Все персиковое. Когда первый, он падает. Любая причина, почему это так. Я думал, что в rawQuery() я мог бы это сделать. До тех пор, пока я не включаю в себя предложения, которых нет. Любая помощь очень ценится.

ответ

2

Давайте назовем их, event курсор:

public Cursor getEventsName() { 
    return database.rawQuery("SELECT event_name FROM events", null); 
} 

... и * курсор:

public Cursor getEventsName() { 
    return database.rawQuery("SELECT * FROM events", null); 
} 

Большинство ответов, которые вы получили (даже те, которые здесь: In Android, does _id have to be present in any table created?) гадают на вероятно, причина для вашей ошибки. Я полагал, что я отвечу на ваш вопрос, а также:

Any reason as to why (the former crashes and the later is peachy?)

Разница между * и event курсоров, что * выбирает каждый столбец неявно и event только выбор event_name.В вашем events таблице, * курсор является эквивалентом:

SELECT _id, event_name FROM events; 

именно поэтому этот курсор работает только peachily. Другими словами, вы не получаете эту ошибку:

java.lang.IllegalArgumentException: column '_id' does not exist 

, потому что вы неявно выбрать _id столбец с *.

Конечно, наиболее вероятной причиной получения этой ошибки является привязка данных с помощью ListView, Spinner и т. Д .; все они склонны использовать CursorAdapter в некоторой форме. Это из CursorAdapter documentation:

Adapter that exposes data from a Cursor to a ListView widget. The Cursor must include a column named "_id" or this class will not work.

Так Решение проста: вы должны выбрать _id столбец в запросе, а также другие столбцы, которые вы хотите. (Компилятор вам не врут.)

Если это все еще не подходит для вашего приложения или не имеет смысла, пожалуйста, отправьте код, в котором вы используете Курсор, и ошибка брошена ,

+0

Я вижу, что вы говорите. Казалось, что это был вероятный преступник, но его очень надоедает, чтобы включить это, когда я этого не хочу. Я чувствую, что это пустая трата, когда я никогда не буду ее использовать, или, по крайней мере, из того, что я предусмотрел в реализации, но я обязательно включу ее сейчас. Спасибо за то, что вы взяли, чтобы ответить на мой вопрос. – Andy

1

Я подозреваю, что все, что обрабатывалось курсором, пыталось получить столбец _ID, но он не был указан в вашем заявлении select. Делая какие-нибудь подобное,

public Cursor getEventsName() { 
    return database.rawQuery("SELECT _id, event_name FROM events", null); 
} 

Некоторые Android компоненты, такие как SimpleCursorAdapter требуют _ID быть доступны в выбранном отчете, поскольку она использует внутренне, когда getItemId() называется.

+0

Хм, это очень раздражает. Я ценю вход. если не SimpleCursorAdapter, который вы рекомендуете для базы данных, связанной с Android? – Andy

+0

Я убежден, что это раздражает :) В принципе, для «Adapter» требуется уникальный идентификатор для правильной работы каждой строки. Я не уверен, почему наличие '_ID' в предложении select является для вас проблемой, тем более, что вы создали таблицу с полями' _id' и 'event_name'. – stuckless

+0

Мой предыдущий комментарий должен читать «Я НЕ убежден» (думаю, вы не можете редактировать комментарии через определенный промежуток времени) – stuckless

1

java.lang.IllegalArgumentException: column '_id' does not exist

я такая же проблема, это исключение, потому что SimpleCursorAdapter потребность в SELECT колонки под названием _id, так что вы можете решить, когда, например, если вы создали некоторую таблицу с колонкой KEY_ID, как ПК, так что вы можете попробовать это так:

SELECT KEY_ID AS _id, column1, column2 FROM SomeTable. 
0
public Cursor getEventsName() { 
return database.rawQuery("SELECT * FROM events", null); 

Изменить его

public Cursor getEventsName(){ 

    final String[] columns = new String[]{"_id", "event_name "}; 
    return database.query(events, columns, "" , null, null, null, null); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^