2017-01-14 6 views
0

На объекте Realm я вызываю getSchema().getAll() для получения доступных схем, а затем getClassName() по схеме, чтобы получить ее имя.Поиск класса Java для данной схемы Realm

Как я могу впоследствии прочитать данные этой схемы, т. Е. Запрос объектов Java, который он хранит? Я попытался позвонить where(<class>).findAll() на объект Realm, но where() ожидает аргумент, тип которого является рассматриваемым классом Java, и я не нашел способ определить этот класс, учитывая только имя схемы. Обратите внимание, что RealmObjectSchema.getClassName возвращает неквалифицированное имя, которое не подходит для этой цели.

Так что в основном вопрос заключается в том, как найти Java-класс, соответствующий схеме. Информация есть, как я вижу из полей classToTable и classToSchema в RealmSchema.

Или, может быть, where().findAll() не лучший подход для извлечения данных?

ответ

1

Ну возможность будет полагаться на какой-то пакет внутреннего API, то RealmProxyMediator получить классы:

RealmProxyMediator mediator = realm.configuration.getSchemaMediator(); 
final Set<Class<? extends RealmModel>> modelClasses = mediator.getModelClasses(); 

Но согласно Realm журнал 0.88.0 изменения:

Удалены RealmConfiguration.getSchemaMediator() из общедоступного API, который устарел в 0.86.0. Для получения набора классов моделей воспользуйтесь RealmConfiguration.getRealmObjectClasses() (№ 1797).

Так что просто используйте RealmConfiguration.getRealmObjectClasses().

getRealmObjectClasses()

public Set<Class<? extends RealmModel>> getRealmObjectClasses():

Возвращает неизменяемый набор типовых классов, которые составляют схему для этого Царства.

Тогда вы можете просто перебирать, что и использовать class эс, возвращаемые в наборе для параметра where(class).

+1

Спасибо. Все еще есть компромисс - я хотел бы передать класс RealmSchema.getSchemaForClass(), чтобы проверить, является ли это схемой, которую я ищу, но оказывается, что этот метод является локальным пакетом. Поэтому кажется лучшим, что я могу сделать, это перечислить схемы и сравнить их имена с простыми (неквалифицированными) именами классов. Не идеально, но достаточно хорошо. – Dabbler

+1

Просто убедитесь, что вы не обфускаете RealmObjects при использовании Proguard. – EpicPandaForce

+1

Я всегда стараюсь добавить '-keepnames public class * extends io.realm.RealmObject', чтобы убедиться: D – EpicPandaForce

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