2015-05-01 3 views
3

У меня есть база данных SQLite, с которой я должен постоянно извлекать данные. Изменения могут быть сделаны с данными между каждым извлечением.Что происходит быстрее - курсор или массив?

Моя цель - максимизировать производительность приложения, так что самый быстрый способ сделать это извлечение?

Я могу представить себе 2:

  • постоянно открывающие и закрывающие новые курсоры

  • запросить все данные в начале и сохранить его в ArrayList. При изменении данных измените SQLite DB и ArrayList, используя indexOf.

---- EDITED ----

мне нужны данные для создания маркеров на карте Google.

Я рассмотрел использование CursorLoader, но поскольку мне не нужно взаимодействовать с другими приложениями, я не хочу использовать Content Providers.

Будет ли создание пользовательского загрузчика хорошей идеей?

+0

Что вы делаете с данными? Вы показываете его в списке? Если вы это сделаете, вы должны изучить «CursorAdapter». – AdamMc331

+0

отредактирован .......... – MauriF

ответ

5

Короче говоря, хотя это не всегда так просто, самый быстрый способ сделать все сразу.

Постоянно совершать звонки в базу данных и из базы данных может действительно затруднить работу приложений, особенно если это сервер, а не только база данных SQLite вашего устройства.

В зависимости от того, что вы делаете с данными, вы можете посмотреть что-то вроде CursorAdapter, которое обрабатывает отображение строк из базы данных, и каждый раз, когда вы вставляете/обновляете строку, CursorAdapter обновляет ListView соответственно. Он также обрабатывает открытие/закрытие/переход к следующему курсору, что делает его очень понятным и легким для разработчиков.

Опять же, старайтесь делать все как можно меньше звонков. Если вы придерживаетесь использования ArrayList:

  • Сделайте один звонок в начале для всех элементов.
  • Прокрутите этот курсор и добавьте элементы в список массивов.
  • Используйте список массивов в виде кеша. Конечно, вы можете обновлять БД каждый раз, когда вы обновляете список (который может быть самым безопасным, IMO), или вы можете просто перебирать список и вставлять/обновлять/удалять, когда приложение закрывается. Если вы примете такой подход, убедитесь, что вы делаете это с помощью метода onPause(), так как это один из самых ранних методов, в которых можно убить активность.
2

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

+0

Да, CursorLoaders отличные. Я бы заметил (если не ошибаюсь), что CursorLoader работает только в том случае, если ваше приложение использует ContentProvider. – AdamMc331

1

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

Использование базы данных - это удобный способ централизации данных, благодаря чему многие пользователи могут получить доступ к данным и обновлять данные в любое время. К сожалению, это самый медленный вариант.

Выбор промежуточной точки между скоростью и доступностью - непростая задача. Вы должны найти баланс между устаревшими данными и пропускной способностью.

Если, к примеру, вам было бы комфортно с изображением данных, которые были действительны всего 5 секунд назад, тогда вы, вероятно, могли бы кэшировать данные локально в своем массиве и организовать некоторый механизм, чтобы поддерживать его в актуальном состоянии бежит за кулисами.

Если допустимо 5-минутное отставание, вы, вероятно, можете организовать регулярное нажатие на базу данных.

Кроме того, любой используемый вами механизм должен также обрабатывать параллельные изменения данных - возможно, два пользователя одновременно изменяют одну и ту же дату.

Вам просто нужно решить, где нанести удар.

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