托管对象上下文的临时对象

Posted

技术标签:

【中文标题】托管对象上下文的临时对象【英文标题】:Temporary object for Managed Object Context 【发布时间】:2016-04-05 11:27:14 【问题描述】:

我试图创建和更新临时 NSManagedObject,然后将其插入托管对象上下文进行保存,但在保存状态时我收到错误 Error = Error Domain=NSCocoaErrorDomain Code=1550

更多细节:

我有下一个模型:(“Contact”对象模型)

“ContactNumber”对象模型:

他们的关系:

我有一个带有属性的自定义 NSView 类:

@property (nonatomic, strong) Contact *selectedContact;

在这个课程中,我有一个“添加联系人”按钮。当我按下它时,我会创建一个新的临时对象“联系人”:

-(void)createNewContact

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contact"
                                              inManagedObjectContext:[MTAppDelegate managedObjectContext]];
    Contact *cnt = [[Contact alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
    cnt.isFavorite = @0;
    cnt.isGroupHeader = @0;
    cnt.defaultNumber = @0;
    [self setSelectedContact:cnt];
    [self createPhoneNumber];
 

并向该对象添加新的“联系人号码”:

-(void)createPhoneNumber

    NSEntityDescription *number = [NSEntityDescription entityForName:@"ContactNumber" inManagedObjectContext:[MTAppDelegate managedObjectContext]];
    ContactNumber *newNumber = [[ContactNumber alloc] initWithEntity:number insertIntoManagedObjectContext:nil];
    [newNumber setValue:@"" forKey:@"number"];
    [newNumber setValue:@"-" forKey:@"speedDial"];
    [newNumber setValue:@"Other" forKey:@"type"];
    [newNumber setValue:_selectedContact forKey:@"contact"];

    [_selectedContact addContactNumbersObject:newNumber];

在对 _selectedContact 对象进行一些操作后,我需要将其保存在我的 MOC 中。接下来我做:

NSError *error = nil;
        [[MTAppDelegate managedObjectContext] insertObject:_selectedContact];
        if (![[MTAppDelegate managedObjectContext] save:&error])
        
            NSLog(@"Error = %@", error);
        

我收到下一个错误:

Error = Error Domain=NSCocoaErrorDomain Code=1550 "contactNumbers is not valid." UserInfo=Dangling reference to an invalid object.=null, NSValidationErrorValue=Relationship 'contactNumbers' on managed object (0x6080000d2210) <Contact: 0x6080000d2210> (entity: Contact; id: 0x6080000369c0 <x-coredata:///Contact/t3638ED71-98B8-408A-B640-D25063C79E762> ; data: 
    company = 44;
    contactNumbers =     (
        "0x608000037920 <x-coredata:///ContactNumber/t3638ED71-98B8-408A-B640-D25063C79E763>"
    );
    defaultNumber = 0;
    firstName = 11;
    isFavorite = 0;
    isGroupHeader = 0;
    lastName = 33;
    middleInitial = 22;
) with objects (
    <ContactNumber: 0x6080000abb20> (entity: ContactNumber; id: 0x608000037920 <x-coredata:///ContactNumber/t3638ED71-98B8-408A-B640-D25063C79E763> ; data: 
    contact = "0x6080000369c0 <x-coredata:///Contact/t3638ED71-98B8-408A-B640-D25063C79E762>";
    number = "";
    speedDial = "-";
    type = Other;
)
), NSAffectedObjectsErrorKey=(
    "<ContactNumber: 0x6080000abb20> (entity: ContactNumber; id: 0x608000037920 <x-coredata:///ContactNumber/t3638ED71-98B8-408A-B640-D25063C79E763> ; data: \n    contact = \"0x6080000369c0 <x-coredata:///Contact/t3638ED71-98B8-408A-B640-D25063C79E762>\";\n    number = \"\";\n    speedDial = \"-\";\n    type = Other;\n)"
), NSValidationErrorObject=<Contact: 0x6080000d2210> (entity: Contact; id: 0x6080000369c0 <x-coredata:///Contact/t3638ED71-98B8-408A-B640-D25063C79E762> ; data: 
    company = 44;
    contactNumbers =     (
        "0x608000037920 <x-coredata:///ContactNumber/t3638ED71-98B8-408A-B640-D25063C79E763>"
    );
    defaultNumber = 0;
    firstName = 11;
    isFavorite = 0;
    isGroupHeader = 0;
    lastName = 33;
    middleInitial = 22;
), NSLocalizedDescription=contactNumbers is not valid., NSValidationErrorKey=contactNumbers, NSValidationErrorShouldAttemptRecoveryKey=true

请帮帮我。

【问题讨论】:

【参考方案1】:

错误 1150 表示您有核心数据验证错误。因此,您正在尝试保存与数据模型规范相矛盾的内容。

我建议您检查所有实体和属性,检查哪些是可选的,哪些是可选的,关系的数量是否有限制,值是否有范围等。

记录所有更改的对象并比较这些规则。保存时生成的错误对象实际上应该提供一些更可操作的信息。

也可能是您多次添加同一个对象作为与同一个父对象的关系。

“悬空引用”意味着您的对象图有误。那可能是反向关系设置不正确。

根据您发布的代码:确保将新创建的联系号码分配给联系人实体。

【讨论】:

我已经设置了对“Contact”对象的引用:[newNumber setValue:_selectedContact forKey:@"contact"]; 但没有任何改变......得到了同样的错误

以上是关于托管对象上下文的临时对象的主要内容,如果未能解决你的问题,请参考以下文章

临时托管对象未正确从子上下文合并到主上下文

在后台队列中保存临时托管对象上下文

核心数据和托管对象上下文

无法在具有现有ObjectWithID 的子上下文中检索临时对象:错误:

NSManagedObject 的 managedObjectContext 属性为 nil

批量更新后更新托管对象上下文中的托管对象