【问题标题】:Changes to Core Data are not saved when use deletedObjects:entity.attributeName使用 deletedObjects:entity.attributeName 时不会保存对核心数据的更改
【发布时间】:2014-08-14 07:58:23
【问题描述】:

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

+ (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”来删除它们。这种方法有什么问题吗?

【问题讨论】:

    标签: core-data nsmanagedobject


    【解决方案1】:

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

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

    【讨论】:

    • Tom,我正在尝试实现 Apple 的核心数据可转换属性示例。 whichPhoto 是核心数据实体之间链接的一侧。主要实体(表)具有所有信息和缩略图的可转换版本。 MeetPhoto 实体具有实际的(可转换的)照片。我担心的是“已删除”的照片在消耗空间周围徘徊。 Apple 的方法似乎很麻烦,所以我为我的 NSManagedObject 子类创建了一个 Category 并尝试在其中进行创建和删除。如果您认为有帮助,我可以发布更多代码。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多