使用deletedObjects:entity.attributeName时,不会保存对Core Data的更改

时间:2014-08-13 22:25:30

标签: core-data nsmanagedobject

我正在尝试删除两个链接实体中某些属性的值。这是我正在使用的代码:

+ (MeetPhoto *)deletePhotoForSelectedMeet:(MarksFromMeets *)specificMeet
                   inManagedObjectContext:(NSManagedObjectContext *)context;
{
    MeetPhoto *results = nil;
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"MarksFromMeets"];
    request.predicate = [NSPredicate predicateWithFormat:@"uniqueResultID = %@", specificMeet.uniqueResultID];

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"uniqueResultID" ascending:YES];
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    NSError *error = nil;
    NSArray *matches = [context executeFetchRequest:request error:&error];
    if (!matches || [matches count] > 1) {
        NSLog(@"There has been an error in matches in %@: \n%@.\n matches count = %lu",
              NSStringFromClass([self class]),
              NSStringFromSelector(_cmd),
              (unsigned long)[matches count]);
    } else if ([matches count] == 0){
        NSLog(@"There were no matches in %@: \n%@.\n matches count = %lu",
              NSStringFromClass([self class]),
              NSStringFromSelector(_cmd),
              (unsigned long)[matches count]);
    } else {
        if (debug == 1) NSLog(@"In %@ and matches = %lu",NSStringFromClass([self class]),(unsigned long)[matches count]);

        for (MarksFromMeets* meetEntity in matches) {

            if (debug == 1) NSLog(@" MarksFromMeet = %@ \n thumbnail = %@ \n photo = %@",meetEntity.meetName,meetEntity.photoThumbNail,meetEntity.whichPhoto.photo);

            [context deleteObject:meetEntity.photoThumbNail];
            [context deleteObject:meetEntity.whichPhoto.photo];
            NSError *mySavingError = nil;
            [meetEntity.managedObjectContext save:&mySavingError];
            if (mySavingError) NSLog(@"In %@ and mySavingError is %@",NSStringFromClass([self class]), mySavingError);
        }

    }

    return results;
}

其中whichPhoto是两个核心数据实体之间链接的标题。

这是NSLog声明:

2014-08-13 14:40:45.334 ITrackXC[12054:60b] thisMeetsPhoto should equal nil and equals (null)
2014-08-13 14:41:37.095 ITrackXC[12054:60b] In MeetPhotoViewController and executing imagePickerController:didFinishPickingImage:editingInfo:
2014-08-13 14:41:37.583 ITrackXC[12054:60b] In MeetPhoto and matches = 1
2014-08-13 14:41:37.589 ITrackXC[12054:60b]  whichMeetPhotographed = <MarksFromMeets: 0x1700c5be0> (entity: MarksFromMeets; id: 0xd000000000300004 <x-coredata://ED56838C-9F27-451D-97CA-01AF0FC38830/MarksFromMeets/p12> ; data: {
    athleteGrade = "12th Grade";
    event = "5000 Meters";
    eventPR = 1;
    eventSB = 1;
    markInEvent = "19:03";
    meetDate = "2013-11-02 07:00:00 +0000";
    meetID = 78103;
    meetName = "OSAA 3A/2A/1A State Championships";
    photoThumbNail = "<UIImage: 0x170281b80>";
    placeInEvent = 2;
    raceSorter = 5000;
    seasonName = 2013;
    sortMark = 1143;
    standardOrMetric = nil;
    uniqueResultID = 10032696;
    whichPhoto = "0x178236d80 <x-coredata:///MeetPhoto/t9C5E481D-5911-47C9-AA8B-6015AAD1C23C2>";
    whoRan = "0xd000000000080000 <x-coredata://ED56838C-9F27-451D-97CA-01AF0FC38830/AthleteInfo/p2>";
}) 
 photo = <UIImage: 0x17009b440> 
 thumbnail = <UIImage: 0x170281b80>
2014-08-13 14:41:37.599 ITrackXC[12054:60b] NSManagedObjects did change.
2014-08-13 14:41:39.444 ITrackXC[12054:60b] NSManagedContext did save.

我没有收到任何错误。但是,当我查看显示数据的TableView时,照片仍然是记录的一部分。

我可以通过将它们设置为“nil”来删除缩略图和相关照片。这种方法有问题吗?

1 个答案:

答案 0 :(得分:0)

将属性值设置为nil是你应该如何做到的,所以不,它没有问题。 deleteObject:方法仅适用于要删除托管对象的情况。在其他情况下使用它可能不会崩溃,但它也不会产生你想要的效果。

如果是照片,可能需要删除一个对象,但很难从代码中分辨出来。你似乎想要摆脱meetEntity.whichPhoto.photo。我不知道whichPhoto是什么;如果它是托管对象,则可能想要在deleteObject上调用myEntity.whichPhoto来删除它。如果没有其他人在使用它,那就是。