Лучшая практика хранения данных в памяти и базе данных в то же время на Android


0 Answers

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

Конечно, все зависит от того, как вы используете данные. ListViews довольно хорошо оптимизированы для обработки большого количества строк (я тестировал в 5000 диапазонов без реальных проблем).

Если вы собираетесь хранить кеш памяти, вы можете захотеть, чтобы база данных уведомила кеш при его изменении содержимого, а затем вы можете обновить кеш. Таким образом, любой может обновить базу данных, не зная о кешировании. Кроме того, если вы создаете ContentProvider над своей базой данных, вы можете использовать ContentResolver для уведомления об изменениях, если вы зарегистрируетесь с помощью registerContentObserver.

Question

Мы разрабатываем Android-приложение с большим количеством данных («клиенты», «продукты», «заказы» ...), и мы не хотим запрашивать SQLite каждый раз, когда нам нужна запись. Мы хотим избежать запросов к базе данных как можно больше, поэтому мы решили хранить определенные данные всегда в памяти.

Наша первоначальная идея - создать два простых класса:

  1. «MemoryRecord»: класс, который будет содержать в основном массив объектов (строка, int, double, datetime и т. Д.), Которые являются данными из записи таблицы, и все методы для получения этих данных из этого массив.

  2. «MemoryTable»: класс, который будет содержать в основном карту [Key, MemoryRecord] и все методы для управления этой Картой и вставки / обновления / удаления записи в / из базы данных.

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

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

Но нам нужна помощь / совет от вас. Можете ли вы предложить что-то более простое или эффективное для реализации такого? Или, может быть, некоторые существующие классы, которые уже делают это для нас?

Я понимаю, что вы, ребята, пытаетесь показать мне, и я благодарю вас за это.

Но, допустим, у нас есть таблица с 2000 записями, и мне нужно будет перечислить эти записи. Для каждого из них я должен запросить другие 30 таблиц (некоторые из них с 1000 записями, другие с 10 записями), чтобы добавить дополнительную информацию в список, и это пока «летает» (и, как вы знаете, мы должны быть очень быстрыми в данный момент).

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

ОК, но этот запрос станет очень сложным и уверенным, хотя SQLite очень быстр, он будет слишком «медленным» (2 раза в 4 секунды, как я уже подтвердил, и это не приемлемое для нас время).

Другим осложнителем является то, что в зависимости от взаимодействия с пользователем нам нужно «повторно запросить» все записи, потому что задействованные таблицы не совпадают, и нам нужно «повторно присоединиться» к другому набору таблиц.

Таким образом, альтернатива приводит только к основным записям (это никогда не изменится, независимо от того, что пользователь делает или хочет) без соединения (это очень быстро!) И запрашивать другие таблицы каждый раз, когда нам нужны некоторые данные. Обратите внимание, что в таблице, содержащей только 10 записей, мы будем извлекать одни и те же записи много и много раз. В этом случае это пустая трата времени, потому что, несмотря на быстрый SQLite, всегда будет дороже запрос, курсор, выборка и т. Д., А не просто захват записи из своего «кэша памяти». Я хочу пояснить, что мы не планируем постоянно хранить все данные в памяти, а просто некоторые таблицы, которые мы запрашиваем очень часто.

И мы подошли к первому вопросу: «Каков наилучший способ« кешировать »эти записи? Мне очень нравится сосредоточиться на этом обсуждении, а не «зачем вам кешировать данные?»




Related