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

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

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

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

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

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 09, 2018
Tweet

Transcript

  1. 1.

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

    двух платформах в трёх приложениях и почти не страдаем Александр Карамышев Разработчик
  2. 4.
  3. 5.
  4. 8.

    Кб в памяти 0 1,75 3,5 5,25 7 Realm Object

    Примеры использования слов (11 319 шт)
  5. 9.

    Кб в памяти 0 20 40 60 80 Realm Object

    Слова (4 324 шт) и примеры
  6. 10.

    Кб в памяти 0 20 40 60 80 Realm Object

    Сеты слов (136 шт) и все их данные
  7. 12.

    Кб в памяти 0 20 40 60 80 Realm Object

    11319 примеров слов 4324 слова 136 списков слов
  8. 13.

    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; } Один ко многим
  9. 14.

    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; } Один ко многим
  10. 15.
  11. 16.
  12. 17.
  13. 18.
  14. 19.
  15. 24.

    Большая транзакция 1) Отдельный realm для тренировок defaultConf = new

    RealmConfiguration.Builder() .build(); Realm.setDefaultConfiguration(defRealmConf); File trainingFolder = createTrainingFolder() trainingConf = new RealmConfiguration.Builder() .directory(trainingFolder) .name("trainingRealm") .build();
  16. 26.

    Проблема мелких транзакций public class WordsetRealm { private String source;

    private boolean isLearned; private Date createdAt; private RealmList<Word> words; }
  17. 27.

    Структура отношений public class RealmWordsetInfo extends RealmObject { int id;

    String title; String subtitle; } public class RealmWordsetData extends RealmObject { int id; RealmList<RealmWord> words; }
  18. 30.
  19. 31.
  20. 33.

    Решение 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; }
  21. 34.
  22. 36.
  23. 37.

    Чистота базы данных class RealmWord extends RealmObject { int id;

    RealmList<Example> examples; } void updateExamples(RealmWord word, ApiWord apiWord) { realm.executeTransaction(realm -> { word.examples.clear(); // остальные действия }); }
  24. 38.

    Чистота базы данных class RealmWord extends RealmObject { int id;

    RealmList<Example> examples; } void updateExamples(RealmWord word, ApiWord apiWord) { realm.executeTransaction(realm -> { word.examples.deleteAllFromRealm(); // остальные действия }); }
  25. 40.

    Почему всё таки Realm? • Действительно очень быстрый • Экономит

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