Как стать автором
Обновить

Комментарии 9

Спасибо за статью. Но есть несколько замечаний и вопросы на который я не нашел для себя ответа.


  1. Преимущество Realm не в том что он "вживую" обновляет данные и сам дергает NotifyPropertyChanged. Это все прекрасно умеет и Fody.PropertyChanged. Но в случае Fody вам не придется ваши модели наследовать от конкретного объекта (RealmObject). Собственно если посмотрите исходники Realm для C# то можете что они всю эту "магию" реализуют через Fody


  2. Как и сказано выше, Realm дает преимущество когда есть и сервер на Realm Object Server. Таким образом Realm продвигает идею что вам не надо самим писать логику синхронизации данных с сервером. Просто сохраняйте данные в модели и данные синхронизируются сами.


  3. Я так и не нашел ответа на вопрос и во всех статьях про Realm "забывают" уточнить про этот самый важный вопрос. Приложения почти никогда не пишутся на века. Схема данных меняется. Там где у нас был Category Category {get; set; } завтра может быть IList Tags {get; set;}. Даже проще. Name может быть переименован во FirstName и т.д. и т.п. Как в таком случае мигрировать категории в теги? В случае SQL мы можем на новую схему написать скрипт миграции. А в случае Realm? Я спрашивал тех кто в бою используют Realm. Они по сути забивают на возможность потери данных или стараются ничего не менять без крайней необходимости ради удобства синхронизации данных клиента и сервера.


    Следующий вопрос как следствие из предыдущих двух пунктов: Если схема данных меняется и даже есть какой то способ смигрировать данные. Как работает синхронизация данных с сервером если часть устройств обновилась и работает с новой схемой а часть устройство еще не обновилась и работают со старой схемой? В случае ручной работы с API мы можем легко поддержать работоспособность старого API до тех пор пока большинство устройств не обновятся и мигрировать вживую старые модели в новые. А как это все делается в Realm Object Server ?
В Realm существует такая возможность как MigrationCallback. Описываете свой метод, ему на вход подается объект Migration, который содержит новый и старый объекты Realm. Далее вы уже сами производите необходимые операции, чтобы преобразовать данные из старого формата в новый.

Отличный пример из документации:
Ситуация когда поля LastName, FirstName заменили на единственное FullName, достаточно запустить такой цикл:
for (var i = 0; i < newPeople.Count(); i++)
        {
            var oldPerson = oldPeople.ElementAt(i);
            var newPerson = newPeople.ElementAt(i);

            newPerson.FullName = oldPerson.FirstName + " " + oldPerson.LastName;
        }


Подробнее о миграции можно почитать тут:

Похоже ссылка о миграции отвалилась. Это получается что в модели надо хранить и старые и новые поля одновременно?

Нет, старые поля будут недоступны, потому что в новой модели они не описаны, и Realm предполагаю удалит из базы все поля(после успешной миграции), которые не описаны в модели,

Спасибо. Гораздо понятнее стало с Realm. А был опыт использования F# + Realm ?

Я пишу только на C#
UPD к комментарию.

Подробнее о миграции можно почитать тут.

Подробнее о миграции можно почитать тут.

Спасибо. В принципе все понятно.

Я так понял это практически то же самое, что и Lex.db
Зарегистрируйтесь на Хабре, чтобы оставить комментарий