Столбец '_id' не существует SimpleCursorAdapter повторно - PullRequest
1 голос
/ 17 октября 2011

Я хочу использовать SimpleCursorAdapter для заполнения моего ListActivity, но я получаю классическое исключение, потому что в моем Cursor нет поля '_id'.К сожалению, этот тип запроса не предоставляет мне поле, которое я могу использовать в качестве поля _id, имеющего форму:

SELECT DISTINCT room from tblRates WHERE resid='ABC' AND date='2011-10-17'

Из-за DISTINCT я не могу просто добавить _id.Итак, что мне делать, если не настроить пользовательский адаптер?

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

Столбец Android '_id' не существует?

Ответы [ 3 ]

5 голосов
/ 17 октября 2011

Вы можете сделать что-то вроде этого ...

SELECT DISTINCT room, 1 _id from tblRates WHERE resid='ABC' AND date='2011-10-17'

Это добавит столбец _id со значением 1 для каждой строки.Также я думаю, что в sqlite есть что-то вроде скрытого столбца «rowid» для каждой таблицы, если вы хотите, чтобы значения для столбца отличались от 1.

3 голосов
/ 17 октября 2011

Так что же мне делать, если не настроить пользовательский адаптер?

Помимо пользовательского подхода Adapter, вы можете использовать CursorWrapper для добавления собственных _id значений. Просто последовательно пронумеруйте их, начиная с 1 или чего-то еще, и не пытайтесь использовать их в качестве фактических ключей в вашей базе данных. : -)


UPDATE

С манжеты ...

Шаг # 1: Создать подкласс CursorWrapper.

Шаг # 2: Повесьте на getColumnCount() значение обернутого Cursor, которое здесь называется N.

Шаг № 3: переопределить getColumnCount() для возврата N+1.

Шаг # 3: переопределить getColumnIndex(), чтобы вернуть N в качестве индекса столбца _id.

Шаг # 4: Переопределить все другие методы, которые принимают int columnIndex в качестве параметра. Если индекс не N, делегируйте работу обернутой Cursor; в противном случае, реализуйте его самостоятельно (или бросьте RuntimeException, если это невозможно или неудобно и вам это не нужно). Для реализаций getInt() и getLong() (не уверен, какой CursorAdapter использует), верните какое-то вероятное уникальное значение (например, просто используйте вашу позицию через getPosition()).

Шаг # 5: Создайте экземпляр вашего подкласса, оберните ваш Cursor предложением DISTINCT и передайте его CursorAdapter.

1 голос
/ 18 июня 2012

Может помочь использование метода «query» в SQLiteDatabase.

Например,

SQLiteDatabase db = openHelper.getReadableDatabase();
Cursor c = db.query(
             "tblRates", 
             new String[] { "_id", "room" }, 
             "resid=? AND date=?", 
             new String[] { "ABC", "2010-10-17" }, 
             "room", 
             null, 
             "room");
SimpleCursorAdapter a = new SimpleCursorAdapter(
                           getActivity(), 
                           android.R.layout.simple_dropdown_item_1line, 
                           c, 
                           new String[] { "room" }, 
                           new int[] { android.R.id.text1 }, 
                           0);
...