Оптимизация работы с базой данных мобильного приложения

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Оптимизация работы с базой данных мобильного приложения
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1052
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Оптимизация работы с базой данных мобильного приложения

CoreData на iOS умеет быть катастрофически медленным, если использовать viewContext для тяжёлых выборок прямо в viewDidLoad. Запрос NSFetchRequest без fetchBatchSize на таблице из 10 000 строк загружает все объекты в память сразу — и это на main thread. На iPad с большой базой данных это 400–600 мс блокировки UI при каждом открытии экрана.

Типичные узкие места

Запросы без индексов. SQLite под капотом у CoreData, Room и большинства мобильных ORM. WHERE по неиндексированному полю на таблице с 50 000 строк делает full scan. На Android Room — добавляем @Index к сущности, на iOS CoreData — выставляем indexed в Data Model Inspector. Разница в скорости выборки — десятки раз.

N+1 запросы. Загружаем список заказов, потом для каждого — отдельный запрос за пользователем. 100 заказов = 101 запрос к SQLite. CoreData решает через relationshipKeyPathsForPrefetching, Room — через @Relation с @Transaction. Flutter + sqflite — JOIN-запрос вместо вложенного цикла.

Запись на main thread. managedObjectContext.save() в iOS, database.insert() в Android — всё это не должно происходить на main thread при больших объёмах. Один save() на 500 объектов на старом iPhone 8 — легко 200–300 мс блокировки.

Решения по платформам

iOS — CoreData

NSPersistentContainer даёт newBackgroundContext() для фоновых операций. Правильная схема:

container.performBackgroundTask { context in
    // массовые операции здесь
    try? context.save()
    DispatchQueue.main.async {
        // обновление UI
    }
}

NSFetchRequest.fetchBatchSize = 20 — CoreData загружает данные порциями по мере обращения, а не всё сразу. NSFetchedResultsController с sectionNameKeyPath для таблиц с секциями — правильный паттерн, который автоматически обновляет UITableView при изменении данных.

Для bulk insert NSBatchInsertRequest (iOS 13+) работает напрямую в SQLite без создания managed objects — в 10–20 раз быстрее стандартного insert для тысяч записей.

Android — Room

@Query с EXPLAIN QUERY PLAN через adb shell — быстрый способ увидеть, есть ли full scan. Room @TypeConverter для JSON-полей через Gson / Moshi работает, но тормозит на массовых выборках — нормализуйте данные.

Flow<List<Entity>> из Room автоматически эмитит новые данные при изменении таблицы — не нужно вручную инвалидировать кэш. distinctUntilChanged() предотвращает лишние эмиссии если данные не изменились.

Room.databaseBuilder().setQueryCoroutineContext(Dispatchers.IO) — явно указываем, что Room-запросы идут на IO-диспетчере.

Flutter — sqflite / Drift (Moor)

Drift (бывший Moor) — предпочтительный выбор для сложных схем: типобезопасные запросы, миграции, генерация кода. database.transaction() для батч-операций — в транзакции 1000 INSERT выполняются за 50–100 мс, без транзакции — 5–10 секунд (каждый INSERT открывает/закрывает транзакцию SQLite).

Кейс: поиск по 200 000 записей

Приложение для offline-каталога товаров: поиск по названию на Room без FTS занимал 1.8 секунды. Подключили FTS4:

@Fts4
@Entity(tableName = "products_fts")
data class ProductFts(val name: String, val description: String)

MATCH по FTS-таблице — 40–60 мс на том же датасете. Разница ощутима.

Сроки

Аудит и оптимизация запросов — 2–4 дня. Добавление индексов, переход на batch-операции и фоновые контексты — 3–7 дней в зависимости от объёма кодовой базы.