Android: SQLite, пользовательский интерфейс, кэширование и асинхронные запросы - PullRequest
0 голосов
/ 29 октября 2011

У меня есть пользовательское представление, которое загружает объект модели (назовем его Person, почему бы и нет).Эти объекты хранятся в БД, получаются через Loader и вставляются в ListView через CursorAdapter, который создает указанные виды.Пока все хорошо.

Теперь у Person есть ссылка на другой объект модели, скажем, Country.Countries находятся в отдельной таблице, и мне нужно название страны (конечно, с идентификатором), чтобы представить ее в элементах списка.

Я вижу три варианта:

  1. Запросите базу данных из метода view, который загружает данные Person (setPerson()?).

  2. Глубокая предварительная загрузка (кажется, я только что составил терминизвините) объекты моей модели с информацией о стране.

  3. Запросить асинхронный запрос данных страны и затем вернуть их в пользовательский интерфейс.

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

Что мне делать?Важен ли показатель производительности (1)?Может быть (1), запросить данные из представления, но реализовать кеш, чтобы избежать повторного попадания в базу данных для одного и того же Country?Может быть (2), с указанным уровнем кэша, чтобы обеспечить уникальность экземпляров объекта?4-й вариант я не рассматривал?Что делают ORM?

Спасибо!

1 Ответ

2 голосов
/ 29 октября 2011

В своем запросе, который вы используете для CursoLoader, выполните INNER JOIN для таблиц Person и Country.Тогда результат запроса будет содержать всю необходимую информацию в одном курсоре.

РЕДАКТИРОВАТЬ В ОТВЕТЕ НА КОММЕНТАРИЙ

Это, вероятно, лучший / самый чистый способидти о вещах.Не беспокойтесь о дублировании памяти на данный момент, это преждевременная оптимизация.Кроме того, насколько большими будут ваши столы?Давайте немного вернемся к расчету конверта здесь.Если каждая строка объединенной таблицы занимает 100 байтов (что является огромной строкой, поэтому я думаю, что здесь сценарий худшего случая), то даже если в вашем результате запроса было 10000 строк (еще раз, это preeeeetttty large), выиспользовать только 1 000 000 байтов или менее 1 МБ памяти.

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