Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2018. Александр Карамышев (SkyEng) — 2...

CodeFest 2018. Александр Карамышев (SkyEng) — 2 года без SQL. Эффективное использование Realm

Посмотрите выступление Александра: https://2018.codefest.ru/lecture/1304/

Доклад посвящен использованию Realm на двух платформах (Android и iOS).

— С какими трудностями столкнулись и как их обошли.
— Как эффективно живем без join'ов.
— Плюсы Realm'а на проекте.
— Для каких проектов Realm актуален, а для каких все же лучше использовать SQL.

CodeFest

April 09, 2018
Tweet

More Decks by CodeFest

Other Decks in Programming

Transcript

  1. 2 года без SQL. Эффективное использование Realm Используем Realm на

    двух платформах в трёх приложениях и почти не страдаем Александр Карамышев Разработчик
  2. Кб в памяти 0 1,75 3,5 5,25 7 Realm Object

    Примеры использования слов (11 319 шт)
  3. Кб в памяти 0 20 40 60 80 Realm Object

    Слова (4 324 шт) и примеры
  4. Кб в памяти 0 20 40 60 80 Realm Object

    Сеты слов (136 шт) и все их данные
  5. Кб в памяти 0 20 40 60 80 Realm Object

    11319 примеров слов 4324 слова 136 списков слов
  6. public class WordsetRealm extends RealmObject { private int id; private

    String title; private RealmList<WordRealm> words; } public class WordRealm extends RealmObject { private int id; private String text; private String translate; private boolean added; } Один ко многим
  7. public class WordsetRealm extends RealmObject { private int id; private

    String title; private RealmList<WordRealm> words; } public class WordRealm extends RealmObject { private int id; private String text; @LinkingObjects("words") private final RealmResults<WordsetRealm> wordsets = null; } Один ко многим
  8. Большая транзакция 1) Отдельный realm для тренировок defaultConf = new

    RealmConfiguration.Builder() .build(); Realm.setDefaultConfiguration(defRealmConf); File trainingFolder = createTrainingFolder() trainingConf = new RealmConfiguration.Builder() .directory(trainingFolder) .name("trainingRealm") .build();
  9. Проблема мелких транзакций public class WordsetRealm { private String source;

    private boolean isLearned; private Date createdAt; private RealmList<Word> words; }
  10. Структура отношений public class RealmWordsetInfo extends RealmObject { int id;

    String title; String subtitle; } public class RealmWordsetData extends RealmObject { int id; RealmList<RealmWord> words; }
  11. Решение v2.0 class Exercise { int id; String title; String

    type List<Word> words; int homeworkId } class ExerciseLearnData { int id; List<Word> words; } class ExerciseHomeworkData { int id; int homeworkId; }
  12. Чистота базы данных class RealmWord extends RealmObject { int id;

    RealmList<Example> examples; } void updateExamples(RealmWord word, ApiWord apiWord) { realm.executeTransaction(realm -> { word.examples.clear(); // остальные действия }); }
  13. Чистота базы данных class RealmWord extends RealmObject { int id;

    RealmList<Example> examples; } void updateExamples(RealmWord word, ApiWord apiWord) { realm.executeTransaction(realm -> { word.examples.deleteAllFromRealm(); // остальные действия }); }
  14. Почему всё таки Realm? • Действительно очень быстрый • Экономит

    память • Легкий доступ к связанным объектам в любой момент • Общий опыт Android и iOS • Постоянно улучшается