Эта статья была рецензирована Марком Таулером . Спасибо всем рецензентам 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 упрощает это, и я чувствую, что это станет важной вехой в мобильном хранилище. Как вы думаете?