2014-01-28 2 views
1

я это One-to-Manyrelationship в Core Data:Fetch объекты Основные данные через один-ко-многим

enter image description here

Каждый SBQChrono может иметь много SBQLaps.

В моей модели у меня есть класс SBQLap:

@interface CILap : NSObject 

@property (strong, nonatomic) NSDate * lapDate; 

@end 

И класс SBQChrono:

@interface CIChrono : NSObject 

@property (strong, nonatomic) NSDate * startDate; 
@property (strong, nonatomic) NSDate * stopDate; 
@property (strong, nonatomic) NSOrderedSet *laps; 

@end 

я все SBQChronoentities делает:

NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:kChronoEntityName]; 

NSError *error; 
NSArray *objects = [appContext.managedObjectContext executeFetchRequest:request error:&error]; 

Как я могу получить указанные SBQLap сущностей за каждый SBQChrono Я нахожу? Я прочитал много сообщений и не могу найти решение.

UPDATE:

После попытки бросить NSManagedObject, я понял, что колена возвращаются в качестве нулевой стоимости.

Выполнение:

для (NSManagedObject * oneObject в объектах) {

CIChrono *chrono=(CIChrono *)oneObject; 

    NSLog(@"startDate %@", chrono.startDate); 
    NSLog(@"stopDate %@", chrono.stopDate); 
    NSLog(@"laps %@",chrono.laps); 

} Я получаю сообщение:

2014-01-28 14:39:48.379 Chrono[2341:70b] startDate 2014-01-28 12:27:53 +0000 
2014-01-28 14:39:48.380 Chrono[2341:70b] stopDate 2014-01-28 12:27:54 +0000 
2014-01-28 14:39:48.380 Chrono[2341:70b] -[NSManagedObject laps]: unrecognized selector sent to instance 0x8b959b0 
2014-01-28 14:39:48.383 Chrono[2341:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSManagedObject laps]: unrecognized selector sent to instance 0x8b959b0' 

Благодарности

+0

Один массив, содержащий все кружки для всех хрононов в массиве 'objects'? – Wain

+1

В основном доступ к NSOrderedSet. CoreData будет прозрачно извлекать их при доступе к ним. Если вы создаете подклассы NSManagedObject из редактора моделей, Xcode будет генерировать для вас аксессоры. – user3071962

+0

Я хочу найти только кружки указанного Chrono;) Спасибо – santibernaldo

ответ

6

Много интересных ответов на этот.

Ответ очень прост и не требует подкласса NSManagedObject для доступа к объектам в отношениях. Вам просто нужно использовать KVC (Key Value Coding) для доступа к этим объектам. Это относится к отношениям и атрибутам.

Если вы хотите использовать синтезированные методы, вы можете подклассифицировать, как некоторые намекали, но это необязательно.

Вот это расширение на свой пример, который вы публикуемую в вашем вопросе:

for (NSManagedObject *oneObject in objects) { 

    CIChrono *chrono=(CIChrono *)oneObject; 

    NSLog(@"startDate %@", [chrono valueForKey:@"startDate"); 
    NSLog(@"stopDate %@", [chrono valueForKey:@"stopDate"]); 
    NSLog(@"laps %@", [chrono valueForKey:@"laps"]); 

    NSSet *laps = [chrono valueForKey:@"laps"]; 

    for (NSManagedObject *lap in laps) { 
     NSLog(@"Lap entity: %@", lap); 
    } 
} 

-valueForKey: Обратите внимание на звонки. Это ключевое значение кода, на которое отвечает NSManagedObject экземпляров (и все другие объекты Objective-C). Я бы предложил прочитать документацию по KVC и KVO.

+0

Youre right man. Уже получаю колени;) – santibernaldo

+0

Проверяйте документацию KVC и KVO. благодаря – santibernaldo

0

Как вы добавили SBQCrono объекты массива, который вам нужно будет отдать:

SQBChrono *anObject = (SQBChrono *)objects[0]; 

Тогда вы можете:

Даст вам NSSet всех связанных объектов?

0

Объекты массива содержат все объекты вашего SBQChrono.

Вы можете получить весь SBQLaps, связанный с одним хронометром, выполнив:

SQBChrono * myChrono = objects[indexOfTheDesiredChrono];

колена хроы затем в myChrono.laps, который является NSOrderedSet (сбор) SBQLaps. Может превратиться в массив как это:

NSArray * myChronoLaps = [myChrono.laps array]

0

Вы можете получить объекты, которые имеют отношение к «SBQChrono».

Это можно сделать с помощью двух извлекающих запросов, первым получать все объекты «SBQChrono» & затем выполнить второй запрос для лиц «SBQLap» с предикатом:

[NSPredicate predicateWithFormat:@"chrono IN %@",objects] 
+0

Ненужное, поскольку у него уже есть объект 'SBQChrono'. См. Мой ответ для деталей. –

2

Каждый SQBChrono объект содержит набор SBQLap Объекты, связанные с ним. Посмотрите на SQBChrono свойства

@property (strong, nonatomic) NSOrderedSet *laps; 

laps это свойство, которое содержит много SBQLap объектов к одному SQBChrono объекта.

Вы можете получить массив из набора, как это:

NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:kChronoEntityName]; 
NSError *error; 
NSArray *chronoObjectArray = [appContext.managedObjectContext executeFetchRequest:request error:&error]; 

for (SQBChrono * chrono in chronoObjectArray) { 
    NSArray *lapsArray = [chrono.laps array]; 
    NSLog("Chrono: %@ laps: %@", chrono.startDate, lapsArray); 
} 
+0

Спасибо! ;)))))))) – santibernaldo

0

Рассматривая скриншот модели и код, который вы опубликовали, кажется, что модель имеет имя отношения, заданное как lap (единственное число), но определение вашего класса использует laps (множественное число). Core Data будет использовать аксессор для lap, но не понимает laps, так как он не совпадает с именем в модели. Изменение модели, чтобы сказать laps, должно исправить эту проблему.

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