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

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. 2 года без SQL. Эффективное использование Realm Используем Realm на

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

  3. Realm используется в

  4. None
  5. None
  6. Наш опыт

  7. Структура данных в приложении

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

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

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

    Сеты слов (136 шт) и все их данные
  11. Очень ленивый Realm RealmAlternative = proxy[{text:physical education, translation:…}] text =

    null translation = null
  12. Кб в памяти 0 20 40 60 80 Realm Object

    11319 примеров слов 4324 слова 136 списков слов
  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; } Один ко многим
  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; } Один ко многим
  15. None
  16. None
  17. None
  18. None
  19. None
  20. Закрывайте базу данных Не используйте одну базу для всех запросов

  21. Большая транзакция 65 MB 155 MB

  22. Большая транзакция Занимаемая память 0 64 128 192 256 320

    Количество слов 100 1500 3000 4500
  23. Большая транзакция

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

    RealmConfiguration.Builder() .build(); Realm.setDefaultConfiguration(defRealmConf); File trainingFolder = createTrainingFolder() trainingConf = new RealmConfiguration.Builder() .directory(trainingFolder) .name("trainingRealm") .build();
  25. 2) Много мелких транзакций

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

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

    String title; String subtitle; } public class RealmWordsetData extends RealmObject { int id; RealmList<RealmWord> words; }
  28. Упражнения

  29. Упражнения v2.0

  30. None
  31. None
  32. Решение v1.0 class Exercise { int id; String title; List<Word>

    words; int homeworkId; }
  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; }
  34. None
  35. Отладка 1.Realm browser

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

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

    RealmList<Example> examples; } void updateExamples(RealmWord word, ApiWord apiWord) { realm.executeTransaction(realm -> { word.examples.deleteAllFromRealm(); // остальные действия }); }
  39. Отладка 1.Realm browser 2.toString у объекта RealmAlternative = proxy[{text:physical education,

    translation:…}] text = null translation = null
  40. Почему всё таки Realm? • Действительно очень быстрый • Экономит

    память • Легкий доступ к связанным объектам в любой момент • Общий опыт Android и iOS • Постоянно улучшается
  41. @sheckspir88 Александр Карамышев Разработчик Спасибо за внимание! aleksander.karamshev @sheckspir88 sheckspir88@gmail.com