MagicalRecord保存数组的关系

时间:2013-11-24 21:29:07

标签: ios core-data magicalrecord

我有三张桌子。表格运行,引脚和注释。他们之间的关系是:

1运行N Pin

1针N注意

我正在尝试更新Run,插入一个Pin(指向Run)并插入N Notes(指向Pin)。并且,当用户进入另一个屏幕时,我会得到插入针脚的音符。但是,我的问题是只返回一个音符。所以,我不知道错误是在Update / Insert方法上还是在find方法上。我尝试了很多不同的方法来做到这一点,但其中任何一个都解决了我的问题。

插入/更新:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    // Get current Run
    Run *runDb = (Run*) [localContext objectWithID:self.idRun];

    //Create a pin
    Pin *newPin = [Pin MR_createInContext:localContext];
    [newPin setSt_description:self.txtName.text];
    [newPin setRun: runDb];
    /* Set latitude & longitude */
    newPin.dec_latitude = (NSDecimalNumber *)[NSDecimalNumber numberWithDouble:currentLocation.coordinate.latitude];
    newPin.dec_longitude = (NSDecimalNumber *)[NSDecimalNumber numberWithDouble:currentLocation.coordinate.longitude];


    /* Update run, incrementing total pins*/
    int pins = [runDb.int_total_pin intValue];
    NSNumber *pinsN = [NSNumber numberWithInt:pins+1];
    [runDb setInt_total_pin:pinsN];

    for (int i=0; i<[notes count]; i++) {
        Note *note = [Note MR_createInContext:localContext];
        [note setSt_note:[[notes objectAtIndex:i] st_note]];
        [note setPin:newPin];
    }

} completion:^(BOOL success, NSError *error) {
    if(!success)
        NSLog(@"%@", error);
}];

查找方法(获取针脚的所有注释)

-(NSArray*) getNotesFromPin:(NSManagedObjectID*) pinId{
    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"pin == %@", pinId];      
    //Return notes from pin
    return [Note MR_findAllWithPredicate:predicate1];

}

在日志中,我可以看到MagicalRecord正在插入5个对象(3个音符,1个引脚和1个运行):

NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0xba9ba70) Context BACKGROUND SAVING (ROOT) is about to save. Obtaining permanent IDs for new 5 inserted objects
2013-11-24 19:24:28.103 MyProject[35447:1ea1b] __70-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:]_block_invoke_021(0xba9ba70) → Finished saving: <NSManagedObjectContext (0xba9ba70): *** BACKGROUND SAVING (ROOT) ***> on *** BACKGROUND THREAD ***

1 个答案:

答案 0 :(得分:0)

看起来你已经像这样建模了Note和Pin:

Note <-> Pin

即一对一的关系。尝试查看您的模型,并将Pin.note更改为一对多。这也意味着您必须将此剪辑更改为如下所示:

for (int i=0; i<[notes count]; i++) {
    Note *note = [Note MR_createInContext:localContext];
    [note setSt_note:[[notes objectAtIndex:i] st_note]];
    [newPin addNode:note];
}