Проблема с курсором из rawQuery в SimpleCursorTreeAdapter: слишком много таблиц? - PullRequest
0 голосов
/ 03 августа 2010

У меня возникли проблемы с использованием rawQuery для получения курсора для использования в ExpandableListView.У меня есть класс адаптера с именем ExpandableDataAdapter, который расширяет SimpleCursorTreeAdapter.Вот строка, которую я должен создать экземпляр ExpandableDataAdapter:

ExpandableDataAdapter confDataAdapter = new ExpandableDataAdapter(
       this,
       groupCursor,
       R.layout.detaillist_group,
       new String[]{ "TrackName" },
       new int[]{ R.id.rowText },
       R.layout.detaillist_child,
       new String[]{ "Title", "Speakers", "TrackName", "Room" },
       new int[]{ R.id.sessionTitle, R.id.sessionSpeakers, R.id.sessionTrack, R.id.sessionRoom }
      );

Внутри определения класса ExpandableDataAdapter у меня есть следующий метод, чтобы получить дочерний курсор для группового курсора:

protected Cursor getChildrenCursor(Cursor groupCursor) 
{
     // Given a group, return a cursor for all the children in that group.
     Cursor talksCursor = _db.rawQuery("SELECT t1.TalkID as _id, t1.Title," +
     " 'None' as Speakers, t2.TrackName, t1.Room" +
     " from talks t1, tracks t2" +
     " where t1.TrackID = t2.TrackID" +
     " and t2.TrackID=?", new String[]{ groupCursor.getString(groupCursor.getColumnIndex("_id")) });   
   startManagingCursor(talksCursor);
   return talksCursor;
}

Приведенный выше запрос работает, и ExpandableListView обнаруживается.Но, конечно, вышеизложенное является более простой версией фактического запроса, который я хочу выполнить.Когда я заменяю его фактическим (и несколько более сложным) запросом, я получаю исключение.Во-первых, запрос:

protected Cursor getChildrenCursor(Cursor groupCursor) 
{
   // Given a group, return a cursor for all the children in that group.
   Cursor talksCursor = _db.rawQuery("SELECT t1.TalkID as _id, t1.Title," +
     " group_concat(t3.Speaker, ', ') as Speakers, t2.TrackName, t1.Room" +
     " from talks t1, tracks t2, talkspeaker t3" +
     " where t1.TalkID = t3.TalkID" +
     " and t1.TrackID = t2.TrackID" +
     " and t2.TrackID=?" +
     " group by _id, t1.Title, t2.TrackName, t1.Room", 
      new String[]{ groupCursor.getString(groupCursor.getColumnIndex("_id")) });
   startManagingCursor(talksCursor);
   return talksCursor;
}

Исключение, которое я получаю: столбец "Комната" не существует.Этот последний запрос отлично работает из приглашения к базе данных, поэтому я предполагаю, что что-то происходит, когда выполняется механизмом Android.Кроме того, заявление об исключении также поставило меня в тупик.Я использую слишком много таблиц?Функция group_concat создает проблемы?Любые указатели?

Еще примечания: исключение выдается из конструктора адаптера, который определяется следующим образом.Я вызываю конструктор, как показано в первом фрагменте этого поста.

public ExpandableDataAdapter(Context context, Cursor cursor,
      int groupLayout, String[] groupFrom, int[] groupTo,
      int childLayout, String[] childFrom, int[] childTo) 
 {
       super(context, cursor, groupLayout, groupFrom, groupTo, 
                             childLayout, childFrom, childTo);
 }

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Это проблема с вашим SQL. Вы можете выбрать только те поля, которые находятся в предложении Group By. Все остальные поля в предложении SELECT должны быть агрегатными. Поэтому вам, вероятно, придется добавить t2.TrackName и t1.Room в предложение Group By, если это возможно даже с вашим набором данных.

0 голосов
/ 03 августа 2010

Разобрался - похоже, мне пришлось явно объявить имена столбцов во втором запросе.Честно говоря, я не уверен, действительно ли это была проблема или это правильное решение, но в списке появляется ExpandableListView.Рабочий фрагмент:

Cursor talksCursor = _db.rawQuery("SELECT t1.TalkID as _id, t1.Title as Title," +
        " group_concat(t3.Speaker, ', ') as Speakers, t2.TrackName as TrackName, t1.Room as Room" +
    " from talks t1, tracks t2, talkspeaker t3" +
    " where t1.TalkID = t3.TalkID" +
    " and t1.TrackID = t2.TrackID" +
    " and t2.TrackID=?" +
    " group by _id, t1.Title, t2.TrackName, t1.Room", 
        new String[]{ groupCursor.getString(groupCursor.getColumnIndex("_id")) });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...