В чем разница Room и Realm в Android
Что проверяют
Понимаете ли вы разницу между ORM над SQLite и отдельной объектной базой и знаете ли, в каком состоянии эти технологии сейчас. Вопрос часто про легаси: в проекте есть Realm, стоит ли на нём оставаться. Следом спрашивают про миграции схемы и работу с потоками.
Как отвечать
- Room: часть Jetpack, слой над SQLite. Таблицы описываются через
@Entity, запросы в@Daoпишутся на SQL и проверяются при компиляции (кодогенерация через KSP). Из коробкиsuspend-функции иFlow, который выдаёт новые данные при изменении таблицы. Миграции задаются классомMigrationили через@AutoMigrationдля простых случаев. Запрос на главном потоке по умолчанию бросает исключение. Связи не ленивые:@Relationи@Embedded, объект не подгружает данные сам по мере обращения. В свежих версиях Room поддерживает Kotlin Multiplatform; - Realm: собственный движок на C++, не SQLite. Живые объекты: результат запроса обновляется сам при изменении данных, чтение без копирования. Запросы на своём языке RQL, связи хранятся как ссылки между объектами. В старом Realm Java объекты были привязаны к потоку, в Realm Kotlin SDK они замороженные и безопасно передаются между потоками. Минус: нативные библиотеки заметно увеличивают размер APK.
Важный контекст: MongoDB объявила Atlas Device Sync устаревшим в 2024 году и отключила его в 2025, а SDK Realm остались в open source без активного развития с её стороны. Главный довод в пользу Realm, встроенная синхронизация, больше не работает. Для новых проектов по умолчанию выбирают Room или SQLDelight, а Realm в существующем приложении планируют к миграции.
Про скорость говорите осторожно: на мобильных объёмах важнее миграции, тестируемость и поддержка библиотеки.
Где спотыкаются
Называют синхронизацию через Realm Object Server преимуществом. Этот сервер давно закрыт, а его преемник Device Sync тоже выведен из эксплуатации.
Говорят «Realm всегда быстрее». Такие бенчмарки старые и сильно зависят от сценария.
Не знают про миграции Room. Изменили @Entity без повышения версии и без миграции, получили падение у всех пользователей после обновления, а fallbackToDestructiveMigration() в проде молча стирает данные.