Статьи

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

Эта статья была рецензирована Марком Таулером . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!

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

Как правило, базы данных медленно читают и записывают данные, и Realm.io — это многообещающее решение, которое может упростить разработку и предлагает повышение производительности с SQLite для Android и Core Data на iOS.

Realm — это кроссплатформенная мобильная база данных, выпущенная для общественности в июле 2014 года и созданная с нуля, предназначенная для работы непосредственно на телефонах, планшетах и ​​носимых устройствах. Realm прост, быстр и совместим с iOS и Android.

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

Начало работы с Realm на Android

Вы можете скачать пример проекта на основе этого руководства с GitHub .

Откройте build.gradle (приложение) , добавьте необходимые зависимости и синхронизируйте проект.

dependencies { … compile 'io.realm:realm-android:0.86.0' } 

Прочитайте документацию по Java для получения более подробных инструкций .

Модели данных

Модели данных областей основаны на принципах Java Beans . Объект модели данных выглядит примерно так.

 public class Contact extends RealmObject { private String name; private String email; private String address; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 

Представленный выше класс java будет представлять RealmObject личной контактной информации человека, и будет хранить новые контакты в памяти и делать запросы для возврата этих сохраненных контактов.

Основные операции

Как и с любой другой платформой базы данных, основные операции для базы данных Realm называются операциями CRUD (создание / чтение / обновление / удаление). Эти операции происходят внутри блоков транзакций.

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

Для работы с Realm сначала получите экземпляр Realm для основного потока пользовательского интерфейса.

 Realm realm = Realm.getInstance(this); 

Используйте этот экземпляр для работы с базой данных Realm. Давайте попробуем создать объект Contact и напишем его в Realm.

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

 realm.beginTransaction(); Contact contact = realm.createObject(Contact.class); contact.setName("Contact's Name"); contact.setEmail("[email protected]"); contact.setAddress("Contact's Address"); contact.setAge(20); realm.commitTransaction(); 

Здесь Realm создает новый RealmObject на основе класса модели Contact.java . Я добавил некоторые значения в новый объект, и для завершения блока транзакции commitTransaction() метод commitTransaction() . Во время фиксации все изменения будут записаны на диск.

Тот же процесс может быть выполнен с помощью executeTransaction() . Этот метод автоматически обрабатывает методы начала / принятия транзакции.

 realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { Contact contact = realm.createObject(Contact.class); contact.setName("Contact's Name"); contact.setEmail("[email protected]"); contact.setAddress("Contact's Address"); contact.setAge(20); } }); 

Для Android рекомендуется обрабатывать все записи в фоновом потоке, чтобы избежать блокировки потока пользовательского интерфейса, поэтому Realm поддерживает асинхронные транзакции. В предыдущем методе executeTransaction() просто добавьте параметр Realm.Transaction.Callback() чтобы сделать процесс асинхронным.

 realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { Contact contact = realm.createObject(Contact.class); contact.setName("Contact's Name"); contact.setEmail("[email protected]"); contact.setAddress("Contact's Address"); contact.setAge(20); } }, new Realm.Transaction.Callback() { @Override public void onSuccess() { //Contact saved } @Override public void onError(Exception e) { //Transaction is rolled-back } }); 

Запросы

Работа с запросами также проста с Realm. Вам не нужно создавать сложные запросы и обрабатывать исключения базы данных, такие как SQLException или CursorIndexOutOfBoundsException , два наиболее вероятных исключения в SQLite.

 //Query to retrieve all Contacts RealmQuery<Contact> query = realm.where(Contact.class); // Add query conditions: age over 18 query.greaterThan("age", 18); // Execute the query: RealmResults<Contact> result = query.findAll(); //Contacts stored in result 

Или, если вы хотите, чтобы он работал асинхронно:

 // Execute the query asynchronously: RealmResults<Contact> result = query.findAllAsync(); 

Удалить данные из Realm очень просто.

 realm.beginTransaction(); result.remove(0); realm.commitTransaction(); 

Помните, что операции с областями обрабатываются внутри блоков транзакций.

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

  • @Required@Required проверки, чтобы запретить нулевые значения
  • @Ignore — поле не должно сохраняться на диске
  • @Index — добавить поисковый индекс в поле
  • @PrimaryKey — уникально идентифицирует каждую запись в базе данных.

Отношения между RealmObjects обрабатываются как отношения между таблицами в базах данных SQL.

Если вы разрабатываете в формате данных JSON, в Realm встроены методы для хранения и извлечения данных JSON.

Нечто дополнительное из Царства

Возможна интеграция Realm с другими часто используемыми библиотеками для Android. Упростите разработку своего приложения и ознакомьтесь с библиотеками, с которыми интегрируется Realm

Вывод

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

Realm упрощает это, и я чувствую, что это станет важной вехой в мобильном хранилище. Как вы думаете?