Исследование возможностей Realm — кроссплатформенной мобильной базы данных

Автор: | 03.08.2026

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

Realm — это кроссплатформенный движок мобильной базы данных, который стремится предоставить разработчикам инструмент, оптимизированный для мобильных устройств, с удобными интерфейсами и аннотациями полей. Вот пример того, насколько просто его использовать:

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

Для выполнения этого руководства не требуется ничего, кроме Android Studio, хотя вы можете использовать любую другую IDE по своему усмотрению.

Если вы не хотите проходить весь процесс настройки приложения, можете просто клонировать мой репозиторий на GitHub по этой ссылке.

Создайте новый проект в Android Studio под названием `RealmNotes` и выберите для него место. Обычно я храню свои Android-приложения в *~/Projects/Android/*, но вы можете разместить его где угодно.

Выберите API 16 в качестве минимальной версии SDK и «Basic Activity» в качестве стартовой точки для этого приложения. Это даст вам заранее настроенную кнопку Floating Action Button, которую мы позже изменим и будем использовать.

Нажмите «Finish» на следующем экране, и вы будете готовы приступить к созданию приложения.

Откройте файл *build.gradle* на уровне проекта и добавьте в него репозиторий *JitPack*, чтобы мы могли устанавливать библиотеки прямо из GitHub. Затем добавьте зависимость для плагина Realm:

Теперь откройте файл *build.gradle* на уровне приложения и примените плагин Realm, а также установите несколько библиотек:

Мы добавили библиотеку RealmRecyclerView, которая является обёрткой для RecyclerView для работы с Realm в качестве хранилища данных. Она предоставляет такие удобные функции, как «pull-to-refresh» и «swipe-to-delete» «из коробки».

Стоит отметить, что основная версия *RecyclerView* должна совпадать с версией `compileSdkVersion`.

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

Откройте файл *app/res/layout/activity_main.xml* и измените иконку кнопки Floating Action Button на «+» вместо стандартного изображения:

Теперь мы добавим поле для ввода текста и RecyclerView в наш макет, чтобы мы могли добавлять и отображать заметки. Откройте *app/res/layout/content_main.xml*, удалите существующий код для TextView и замените его следующим:

Каждый элемент в *RecyclerView* отображается отдельно, и строки заполняют свой собственный макет. Давайте создадим этот макет, создав новый файл ресурсов в *app/res/layout* под названием *note_item.xml* и заменив его содержимое:

Я думаю, сейчас стоит запустить приложение, нажав кнопку *Run*, чтобы убедиться, что всё работает правильно. Если вы видите что-то подобное, значит, всё в порядке.

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

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

Перейдите в *app/java/{ваш_домен}.realmnotes* и создайте новый Java-класс под названием *Note.java*. Этот класс будет содержать определение нашей базы данных вместе с любыми значениями по умолчанию, которые мы можем захотеть создать, такими как идентификаторы и даты:

Как видите, это просто POJO, который реализует RealmModel.

Это важно, потому что это говорит Realm, что это не просто объект, а RealmObject. Подробнее о связях сущностей в Realm можно прочитать здесь. Также у него есть аннотация класса, которая сообщает Realm, что это объект базы данных.

Теперь, когда мы определили, как будет выглядеть наша база данных, вернёмся в *app/java/{ваш_домен}.realmnotes* и откроем *MainActivity*.

Начните с добавления переменных-членов для всех виджетов, которые мы будем использовать, в начало класса, а затем в методе `onCreate` добавьте ссылки на них:

SnackBar говорит: «Replace with your own action», что удобно, так как именно это мы и собираемся сделать. Измените обработчик нажатия на кнопку Floating Action Button, чтобы он вызывал метод `insertNote`:

Теперь создайте этот метод ниже метода `onCreate` и определите его так, чтобы он принимал строку и использовал Realm для добавления записи в базу данных:

Всё вышеописанное — это всё, что нужно для добавления нового элемента в базу данных. Мы инициализируем наш объект и сразу же копируем его в Realm. Запустите приложение ещё раз, и вы увидите, что при добавлении новой заметки SnackBar показывает другое сообщение.

Вы также заметите, что ничего не отображается, так как мы всё ещё не загружаем сообщения из нашей базы данных.

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

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

Если бы мы использовали обычный RecyclerView, мы бы просто расширили *RecyclerView.Adapter*. Поскольку мы используем его модифицированную версию, нам нужно расширить другой класс:

Этот класс выглядит намного сложнее, чем он есть на самом деле, но если вы уже работали с адаптерами в Android, вы, вероятно, чувствуете себя «как дома».

Наш класс принимает Context и объект results в качестве аргументов для своего конструктора. Затем он определяет ViewHolder, который, как следует из названия, хранит информацию о представлении, которое мы пытаемся отобразить.

*ViewHolder* основан на файле ресурсов макета, который мы создали ранее и назвали *note_item.xml*.

Затем мы переопределяем два его метода. Один — для случая, когда ViewHolder создаётся, чтобы мы могли заполнить его нашим макетом, и другой — для случая, когда ViewHolder уже загружен, и мы знаем, что можем безопасно добавить в него данные.

Теперь нам просто нужно загрузить данные из базы данных и передать их нашему адаптеру. Добавьте вызов метода с именем `loadNotes()` в конец метода `onCreate` в классе *MainActivity*.

Создайте метод ниже `onCreate` с таким же именем. Он будет отвечать за загрузку наших заметок и добавление их в адаптер представления:

Мы запрашиваем базу данных, прося её вернуть все сущности, которые хранятся в базе данных для нашей модели *Notes*. Мы используем метод `findAllSorted` без передачи каких-либо фильтров. Подробнее о запросах к базе данных Realm можно прочитать здесь.

Запустите приложение ещё раз, и вы должны увидеть, что заметки, созданные ранее, отображаются в списке. Также попробуйте добавить новую заметку и посмотрите, как RecyclerView автоматически обновляется.

Благодаря *RealmBasedRecyclerViewAdapter* мы также получаем некоторые приятные бонусы «из коробки». Вы уже видели один из них — возможность автоматического обновления, но попробуйте смахнуть одну из заметок влево или вправо, и вы увидите, что она удаляется из базы данных. Мы включили эту функцию ранее, когда создавали макет и установили `app:rrvSwipeToDelete` в значение true.

Последний трюк, который я хочу показать, полезен, когда у вас много заметок и становится сложно что-то найти. С помощью используемой нами обёртки у нас есть возможность добавлять заголовки в адаптер, чтобы отображать информацию более организованно, например, так:

Чтобы заставить эти заголовки работать, нужно изменить класс `NoteRecyclerViewAdapter`, чтобы он создавался со следующими параметрами:

Мы добавили два дополнительных аргумента в конец вызова *super*. Один указывает, что мы хотим показывать заголовки, а второй — что мы хотим упорядочить их по свойству `text` в нашей модели.

Теперь, когда мы рассмотрели, как создать простое приложение с использованием Realm в качестве базы данных, как насчёт того, чтобы перейти к более сложному приложению или использовать его истинную кроссплатформенную мощь в разных приложениях?

Простота использования и возможность запустить базу данных за считанные минуты определённо заставляют меня хотеть создавать с её помощью ещё больше. Не могу дождаться, чтобы услышать, что вы создали. Свяжитесь со мной в Twitter @marcos_placona или по электронной почте marcos@twilio.com и расскажите об этом.