Отображение данных в ListView, когда каждый объект расположен в более чем одной строке в Cursor - PullRequest
0 голосов
/ 09 января 2011

В моем приложении есть база данных sqlite, которая выглядит следующим образом:

CREATE TABLE notes (_id integer primary key, 
                    content text);
CREATE TABLE tags (_id integer primary key,
                   name text,
                   noteid integer,
                   foreign key(noteid) references notes(_id));

Я храню текст, с которым могут быть связаны некоторые теги.Теперь я хочу показать этот текст и теги в ListView.Однако я не могу понять, как это сделать с SimpleCursorAdapter.Это вообще возможно?Мои данные могут выглядеть так:

sqlite> select * from notes;
1|foo bar baz
sqlite> select * from tags;
1|x|1
2|y|1

Запрос на получение всех заметок и данных, которые он возвращает, выглядит так:

sqlite> select notes._id, notes.content, tags.name from notes, tags where notes._id = tags.noteid;
1|foo bar baz|x
1|foo bar baz|y

Теперь, если я хочу связать эти данныеListView каким-то образом, как это сделать?Я был бы счастлив, если бы каждая строка в ListView содержала две строки, одну строку с содержимым и одну строку со всеми тегами.Правильно ли я догадываюсь, что SimpleCursorAdapter мне здесь не поможет?Что мне делать вместо этого?

1 Ответ

1 голос
/ 09 января 2011

SimpleCursorAdapter один не может помочь вам здесь.

Если ваша цель состоит в том, чтобы вы хотели, чтобы одна строка была одной заметкой + все ее теги, вы можете попробовать переопределить bindView() в SimpleCursorAdapter и вставить теги таким образом. Это будет означать, что вы уже создали какой-то HashMap тегов note-> и, следовательно, можете быстро определить теги, которые должны идти в строке.

Чтобы построить HashMap, у меня есть два варианта:

  1. Создайте их на лету, просмотрев заметку в HashMap, затем сделав запрос, чтобы получить теги для этой заметки, если они не найдены, и кэшируйте их в HashMap для последующего повторного использования. (например, прокрутка). Подвох в том, что вы выполняете кучу небольших (плохих) запросов и выполняете их в главном потоке приложения, пока пользователь выполняет прокрутку (очень плохо).

  2. Выполните один большой запрос, используя предложение IN, чтобы получить все теги для всех заметок, и преобразовать полученный Cursor в полностью заполненный HashMap. Тогда все ваши поиски по каждой строке будут успешными. Это хорошо работает, если у вас есть только скромное количество строк; в противном случае этот запрос может занять больше времени, чем у пользователя есть терпение.

Если ваша схема гибкая, вы можете подумать, лучше ли вам обойтись при некоторой денормализации, например, при наличии тегов в одном столбце таблицы заметок через список с разделителями-запятыми или что-то в этом роде. Даже если это усложняет операции записи (например, размещение тегов в двух местах), если количество операций чтения значительно превышает количество записей, это может стоить этого.

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