托管对象上下文的临时对象
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 的子上下文中检索临时对象:错误: