4

В большинстве Android кодов образца, заполнение ListView из SQLite базы данных делается двумя способами,В Android SQLite, работая непосредственно с Cursor, больше памяти эффективнее, чем создание объектов модели?

  1. данные Prefetch в список - Выполнить запрос, создавать объекты модели для каждого строка затем добавить его в список и близкоКурсор, затем заполнить ListView с Список.

  2. Без списка и модели объектов - Выполнить запрос и заполнить ListView следуя курсора с помощью moveToFirst, moveToLast, движение, по мере необходимости.

Теперь я хочу знать, какой из описанного выше способа является более эффективной памяти, в Android?

+0

1 миллион * 5KB - ** 5 ГБ **, правый ??? –

+0

Это не точный счет. Но хотелось бы знать, если это большой размер? в любом случае, я обновлю вопрос, чтобы сделать его 500 МБ. –

+0

Теперь намного лучше и приемлемо ... :) –

ответ

6

Cursor подход является более эффективным памяти:

Предположим, у вас есть 1000 записей в базе данных, и у вас есть ListView, который может показать 10 записей одновременно. Если вы сначала создадите список, вам нужно будет создать 1000 объектов модели (каждая из которых, в свою очередь, состоит из нескольких объектов в зависимости от количества столбцов вашей таблицы), а listview создает дополнительные 10 представлений (на самом деле несколько больше, в зависимости от на макете списка) для отображения 10 предметов. Теперь, когда пользователь прокручивает список, в вашем адаптере вы в конечном итоге копируете данные из объектов модели в просматриваемые в настоящее время элементы списка.

С другой стороны, если вы используете CursorAdapter, всякий раз, когда вам нужно заполнить элемент списка данными, вам предоставляется курсор, содержащий точно данные для этой строки, и вы можете просто выбрать данные столбцов, которые вы на самом деле необходимо отобразить в элементе списка. Нет необходимости создавать объекты модели 1000.

С точки зрения удобочитаемости кода модельный подход был бы лучше, поскольку работа с курсорами довольно низкая, вам нужно знать имена столбцов в базе данных и так далее.

+0

Есть ли ссылки, чтобы узнать, как Android управляет Cursor внутри? –

+1

У меня сейчас нет конкретного. Я знаю, что SQLiteCursor наследует от 'AbstractWindowedCursor', что означает, что он хранит несколько строк вокруг текущей позиции в памяти. Чтобы узнать все о внутренностях, вы можете посмотреть исходный код Android, который (в большинстве случаев) довольно прост в чтении и имеет очень хорошие комментарии. – Ridcully

0

Я думаю, вам нужно использовать Service или, по крайней мере Thread/Async, чтобы ваш UI нить не быть заблокированы. Service лучше, потому что люди могут перейти в другие приложения во время загрузки. Вы можете использовать BroadcastReceiver для связи с вашим бегом Service.

+0

Речь идет об исполнении пользовательского интерфейса. Мне также нужно знать, как управлять результатом запроса, и этот вопрос больше связан с этой областью. –

+0

вы не отвечаете на вопрос;) – mithrop

+0

@mithrop: какой ответ? и кто ? :) –

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