Инициализация объектов и построение отношений CoreData

Я пытаюсь построить отношения для объекта. Но видимо я не все правильно понимаю. Когда я их устанавливаю, похоже, что все они установлены правильно (то есть отношения найдены). Но когда я перебираю их позже, некоторые из них (не все) не существуют.

У меня есть Report, в котором много LineItems. Каждый пункт проверки один Rating. Когда я создаю проверку, я копирую данные из другого объекта, ReportMaster. ReportMaster также имеет MasterLineItems, которые также имеют рейтинги. Но на данный момент я не могу гарантировать правильность связи между MasterLineItems и Ratings. Поэтому, когда я копирую атрибуты ReportMaster для отчета, я также делаю выборку для рейтинга.

У меня есть метод в Report, чтобы проверить, есть ли рейтинги у всех LineItems. Но я никогда не смогу заставить его вернуться true.

Мой вопрос в том, как мне правильно установить эти атрибуты или что я делаю неправильно? Спасибо. (Построение отношений в конце блока кода)

# Creating Report
Report *report = [Report object];
[report setWithMasterReport:masterReport];

# Report.m
- (void)setWithMasterReport:(MasterReport *)masterReport {
    self.name = [masterReport.name copy];

    [self addLineItems:[LineItems copyItemsFromMasterReportItems:masterReport.masterLineItems]];
    NSLog(@"items have ratings: %i",[self lineItemsHaveRatings]);
}

- (BOOL)lineItemsHaveRatings {
    NSArray *lineItems = [[self lineItems] allObjects];
    BOOL t = TRUE;
    for (LineItem *lineItem in lineItems){
        if (lineItem.rating)
            t = t && TRUE;
        else
            t = FALSE;
    }
    return t;
}

# LineItem.m

+ (NSSet*)copyItemsFromMasterReportItems:(NSSet *)masterLineitems {
    NSMutableArray *lineItems = [NSMutableArray arrayWithArray:[masterLineitems allObjects]];

    // go through one by one and replace inspectionFormItem with the inspectionItem copy
    for (NSUInteger i; i < [lineItems count]; i++){
        LineItem *lineItem = [InspectionItem object];
        [lineItem setWithMasterLineItem:[lineItems objectAtIndex:i]];
        [lineItems replaceObjectAtIndex:i withObject:lineItem];
    }

    return [NSSet setWithArray:lineItems];
}

- (void)setWithMasterLineItem:(MasterLineItem *)masterLineItem {
    self.name = masterLineItem.name;
    self.ratingID = masterLineItem.ratingID;

    Rating *rating = [Rating findFirstByAttribute:@"myID" withValue:self.ratingID];
    if (rating)
        [self setRating:rating];
}

Когда я бегу, я получаю

items have ratings: 0

Другая часть этого вопроса заключается в том, что в этих методах «инициализации» (setWith...:) я должен копировать атрибут или нет? Если да, то должен ли я тоже копировать отношения? Мне просто нужен указатель на объект, верно?

Примечание: это объекты CoreData, и я использую RestKit, поэтому я получаю вспомогательный метод findFirstByAttribute:withValue:.

Спасибо за любую помощь.

Обновлять

- (BOOL)LineItemsHaveRatings {
    NSArray *lineItems = [[self LineItems] allObjects];
    BOOL t = TRUE;
    for (LineItem *lineItem in lineItems){
        if (lineItem.rating)
            t = t && TRUE;
        else {
            t = FALSE;
            Rating *rating = [Rating findFirstByAttribute:@"myID" withValue:LineItem.ratingID];
            NSLog(@"[No Rating Found] %@",lineItem);
            NSLog(@"[Rating to find]  %@",rating);
        }
    }
    return t;
}


[No Rating Found] <LineItem: 0x8200e40> (entity: LineItem; id: 0x8200d00 <x-coredata:///LineItem/t05319326-640E-4DA5-B619-EB20621E3D533> ; data: {
    rating = nil;
    ratingID = 13903;
})
[Rating to find]  <Rating: 0xec356a0> (entity: Rating; id: 0xec31520 <x-coredata://4EE6AD5A-CC34-460A-A97A-0909454126A4/Rating/p15553> ; data: {
    myID = 13903;
    name = "APPA (Northwestern Memorial Hospital)";
    rangeItemRatings =     (
        "0xec3a2d0 <x-coredata://4EE6AD5A-CC34-460A-A97A-0909454126A4/RangeItemRating/p2952>",
        "0xec3a2b0 <x-coredata://4EE6AD5A-CC34-460A-A97A-0909454126A4/RangeItemRating/p2950>",
        "0xec3a2e0 <x-coredata://4EE6AD5A-CC34-460A-A97A-0909454126A4/RangeItemRating/p2953>",
        "0xec3a2f0 <x-coredata://4EE6AD5A-CC34-460A-A97A-0909454126A4/RangeItemRating/p2954>",
        "0xec3a2c0 <x-coredata://4EE6AD5A-CC34-460A-A97A-0909454126A4/RangeItemRating/p2951>"
    );
    ratingType = "0xec368b0 <x-coredata://4EE6AD5A-CC34-460A-A97A-0909454126A4/RatingType/p112>";
    ratingTypeID = 1;
})

Мне странно, что другие отношения строятся и остаются связанными. Но это не так. ... ой. У меня не было отношения, установленного как отношение ко многим. Упс.


person RyanJM    schedule 04.04.2012    source источник
comment
Я не знаком с RestKit, но я бы начал с просмотра того, что происходит с ` } else { ` после теста if (rating){. Для вашего lineItemsHaveRatings требуются действительные рейтинги для всего, поэтому было бы полезно знать обо всех случаях, когда они не были возвращены.   -  person Phillip Mills    schedule 04.04.2012
comment
Упс. Это просто опечатка с моей стороны. Я распечатывал операторы ошибок/проверки в своем коде локально.   -  person RyanJM    schedule 04.04.2012
comment
@PhillipMills Какие вещи мне следует искать в тех случаях, когда их не вернули? Локально я просто распечатываю рейтинг и вижу, что он действительно существует.   -  person RyanJM    schedule 04.04.2012
comment
Было бы интересно, произойдет это или нет. Если это произойдет, то в этом MasterLineItem будет что-то странное. (Я говорю это, основываясь на предположении вашего кода, что Rating findFirstByAttribute: всегда будет предоставлять что-то действительное.)   -  person Phillip Mills    schedule 04.04.2012
comment
@PhillipMills - СПАСИБО! Я перезаписал метод description, чтобы все печаталось красиво. Я снял его и посмотрел поближе. Только отношения рейтинга были все перепутаны. Я посмотрел на модель CoreData... Я установил отношение один к одному. Изменение его на отношения «один ко многим» решило мою проблему.   -  person RyanJM    schedule 04.04.2012
comment
Все добавить ответ и закрыть его таким образом.   -  person RyanJM    schedule 05.04.2012


Ответы (1)


Мне просто нужно было изменить тип отношения для Rating.

person RyanJM    schedule 05.04.2012