Как я могу получить доступ к атрибутам Sub-Entity из Suber-Entity в основных данных - PullRequest
2 голосов
/ 31 января 2012

У меня есть супер-сущность в базовых данных, которая называется element, и у меня есть две суб-сущности, называемые (IsBoolean, IsGrade). Я пытаюсь получить доступ к этим атрибутам суб-сущности из кода ниже. Мне нужна ваша помощь по этой проблеме

--------------------- Базовая структура данных -------------------- Супер Сущность [Элемент-> elmentID] Sub Entities [IsBoolean-> value] + [IsGrade-> value]

---------------------- краткий код ----------------------- -----

NSFetchRequest *formRequest = [[NSFetchRequest alloc]init];
NSEntityDescription *formEntity = [NSEntityDescription entityForName:@"Element" inManagedObjectContext:ManagedObjectContext];
NSSortDescriptor *formDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"elementID" ascending:YES]; 
NSPredicate *formPredicate = [NSPredicate predicateWithFormat:@"elementID==%d",2];
[formRequest setPredicate:formPredicate];
[formRequest setEntity:formEntity]; 
[formRequest setSortDescriptors:[NSArray arrayWithObject:formDescriptor]]; 
[formRequest setIncludesSubentities:YES];
resultController_= [[NSFetchedResultsController alloc] initWithFetchRequest:formRequest managedObjectContext:ManagedObjectContext sectionNameKeyPath:nil cacheName:nil  ];
resultController_.delegate =self;
for (Element *elementData in resultController_) {
        // I can access super entity attribute 
        NSlog(@"%@",elementData.elementID);

        // Here i can't access sub entity attribute from super entity 
        NSLog(@"%@",elementData.value);

}

Найти следующий снимок экрана для модели данных enter image description here

Ответы [ 2 ]

1 голос
/ 31 января 2012

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

У вас может быть сущность book * с соответствующим ** Book классом и сущность author с соответствующим Автором классом.В этом случае у них не было бы общей супер-сущности.Но классы вполне могут иметь общий суперкласс, который определяет и реализует, например, @property NSString *name; и @property UIImage *image; и связанные методы.

0 голосов
/ 31 января 2012

Обновление на основе измененного вопроса

У вас не будет каких-либо экземпляров ваших дочерних объектов, если вы не добавили управляемые объекты вваш контекст, который является из субъекта.

Каждая суб-сущность эквивалентна подклассу вашей сущности-элемента - поэтому она будет иметь атрибуты элемента плюс новые атрибуты, которые вы определили в суб-сущности.Он также будет наследоваться в терминах класса, если вы создали собственные подклассы NSManagedObject.

Говорить о доступе к свойствам подобъекта из суперсущества не имеет смысла.

Чтобы добавить экземпляры подобъекта, вы просто вставляете сущности так же, как и любой другой управляемый объект, используя имя подобъекта.


Оригинальный ответ, 90% которого все еще действителен

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

Но изнутри супер-сущности нет, это не имеет никакого смысла.Это то же самое, что наследование классов - вы не можете получить доступ к .text из UIView только потому, что UILabel является его подклассом.Но вы можете иметь список объектов, которые были UIViews, проверить, действительно ли один из них был UILabel, а затем получить доступ к свойству .text.

Для запроса на выборку, возвращающего набор сущностей и подобъектов, вы должны сделать что-то вроде

if ([elementData.entity.name isEqualToString:@"IsBoolean"]) // means it is the isBoolean sub-entity
    NSLog(@"%@",elementData.value);

Чуть лучше, вы получите словарь атрибутов:

NSDictionary *attributes = elementData.entity.attributesByName;
if ([attributes objectForKey:@"value"]) // Means there is an attribute called "value"
    NSLog(@"%@",elementData.value);

В последнем случае словарь полон объектов NSAttributeDescription, которые сообщают вам, с каким типом атрибута вы имеете дело.См. Ссылки на различные основные классы данных ( NSManagedObject , NSEntityDescription и NSAttributeDescription ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...