1

オブジェクトの関係を構築しようとしています。しかし、私はすべてを正しく理解していないと思います。それらを設定すると、すべて適切に設定されているように見えます (つまり、関係が見つかりました)。しかし、後でそれらをループすると、それらの一部 (すべてではない) が存在しません。

私は、Report多くの を持っていLineItemsます。各検品一品Rating。インスペクションを作成するとき、別のオブジェクトからデータをコピーしていますReportMaster。ReportMaster には、Ratings を持つ MasterLineItems もあります。しかし、現時点では、MasterLineItems と Ratings の関係が正しいことを保証できません。したがって、レポートの ReportMaster の属性をコピーするときに、評価のフェッチも行います。

Report 内に、すべての LineItems に評価があるかどうかを確認するメソッドがあります。しかし、私はそれを真に返すことはできません。

私の質問は、これらの属性をどのように適切に設定する必要があるか、または何が間違っているのでしょうか? ありがとう。(コードブロックの最後にある関係構築)

# 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

この質問のもう 1 つの部分は、これらの「init」メソッド ( 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;
})

他の関係が構築され、接続されていることは私にとって奇妙です. しかし、これはそうではありません。... おー。関係を対多関係に設定していませんでした。おっとっと。

4

1 に答える 1

0

の関係タイプを変更する必要がありましたRating

于 2012-04-05T04:12:29.487 に答える