2015-07-08 5 views
2

Realm на Android doesn't support model inheritance/polymorphism.Обмен областями Realm на Android

Итак, есть ли способ поделиться полями на Android? У нас есть 5 моделей, которые имеют одни и те же связанные с синхронизацией поля и код. Мы используем наследование в наших текущих моделях SQLite; если мы переключимся на Realm, наш единственный выбор для дублирования полей синхронизации по каждому из 5 классов модели?

Как обходной путь, я думаю о том, что эти классы реализуют интерфейс Syncable с геттерами и сеттерами для общих полей, что, по крайней мере, позволяет мне совместно использовать функции синхронизации. Есть ли способ лучше?

Чтобы поделиться функциональностью синхронизации, лучше всего сделать статический класс Synchronizer и передать его Syncable объектов модели. Synchronizer будут использовать интерфейс Syncable для работы непосредственно с общими, связанными с синхронизацией объектами моделей и делегировать операции по типам полей. В качестве альтернативы я мог бы предоставить каждому объекту модели свой собственный экземпляр Synchronizer ...

Попытка найти правильный способ обойти ограничение наследования действительно расширяет мои навыки ООПа ... помощь приветствуется!

+0

Что-то для рассмотрения - если оно не поддерживает функцию, которая вам нужна, может быть, вы должны использовать другую библиотеку? –

+0

Вы можете использовать композицию над наследованием, как это предлагает «Банда четырех» («Шаблоны дизайна») и Джошуа Блох (Эффективная Java). В качестве побочного примечания мы рассматриваем возможность наследования, но его можно использовать только во время моделирования объекта, а не при запросе, что бы заставить его чувствовать себя калекой. Каково ваше мнение об этом? – Emanuelez

+0

@ Emanuelez У меня возникли проблемы с выяснением того, как композиция поможет здесь ... вы предлагаете мне разделить каждый объект на две записи в Realm - один для разделяемых полей и другой для полей типа? Насколько я понимаю ограничения запросов, похоже, что это будет калечащим. Запрос абстрактных моделей работает на iOS, верно? В чем проблема Android? –

ответ

1

У меня была такая же проблема, когда я узнал, что realmObjects должен наследовать непосредственно форму класса RealmObject (без поддержки наследования). Чтобы вернуть преимущества полиморфизма, я рассмотрел аналогичное решение для вас в сочетании с некоторыми трюками композиции, которые позволили бы избежать дублирования атрибутов.

«Обсуждение дешево, покажи мне код».

примеры кода

interface IPerson { 
    String getName(); 
} 

class Person extends RealmObject implements IPerson { 

    String name; 

    @Override 
    public String getName() { 
     return name; 
    } 
} 

interface IWorker extends IPerson { 
    int getSalary(); 
} 

class Worker extends RealmObject implements IWorker { 

    Person person; 
    int salary; 

    @Override 
    public String getName() { 
     return person.getName(); 
    } 

    @Override 
    public int getSalary() { 
     return salary; 
    } 
} 

Некоторые преимущества

Вы не должны дублировать ваши атрибуты в каждом простирающейся класса.

Полиморфизм вернулся! Например, теперь вы можете имитировать актерский состав (с помощью getPerson() в этом примере).

Некоторые ограничения

При использовании библиотеки сериализации, которая использует отражение (предположим, это Gson), ваши сериализованные модели будут иметь своих родителей атрибуты внедренный. Не то, что у вас было бы, если бы вы использовали классическое наследование.

Пример с JSON

Давайте предположим, что John Doe делает 500 $ в месяц. (Он - Рабочий и Лицо?).

с классическим наследованием, John Doe будет выглядеть следующим образом:

{ 
    "name":"John Doe", 
    "salary": 500 
} 

Но с этим наследственным обходным путем ...:

{ 
    "person" : { 
    "name":"John Doe" 
    }, 
    "salary": 500 
} 

Надеюсь, это поможет!

Примечание

PrimaryKeys, к сожалению, должны быть дублированы.

Bonus

Вы можете проверить RealmFieldNamesHelper, библиотека сделана Christian Melchior «чтобы сделать Realm запросов более безопасным типом».

Смежные вопросы