gpt4 book ai didi

iphone - 如何设置从一个对象到另一个对象的引用?

转载 作者:行者123 更新时间:2023-12-03 21:11:57 25 4
gpt4 key购买 nike

已解决

我拼错了“property Department”->“Department”。感谢您的回答和深深的抱歉

嗨,

想象一下员工和部门的明显模型,其中每个员工必须引用一个部门,并且每个部门可能没有或有很多员工。

对于 Employee,我有一个指向 Department 的指针,并将其值设置为相关 Department 的对象的地址。

对于部门,我有一个 NSSet,我可以向其中添加员工。

问题是,当我创建一个新员工和一个新部门时,这些对象存在于内存中的某个位置。从员工到部门的引用(反之亦然)包含这些地址。当我获取数据时,它将位于不同的位置。因此并不清楚这些对象之间的连接是如何完成的。

这是我理解的代码:

    // Fetch Plist object
NSDictionary *plistDictionary = [[NSDictionary alloc] initWithDictionary:plistData];

// Create Department Entity
Department *department = (Department *)[NSEntityDescription
insertNewObjectForEntityForName:@"Department"
inManagedObjectContext:managedObjectContext];
// Set properties
[department setName:[plistDictionary valueForKey:@"department"]];

// Create Employee entity
Employee *employee = (Employee *)[NSEntityDescription
insertNewObjectForEntityForName:@"Employee"
inManagedObjectContext:managedObjectContext];

// Set properties
[employee setFileName:[plistDictionary valueForKey:@"picture"]];
[employee setName:[plistDictionary valueForKey:@"name"]];

// Set relationship
[employee setDepartment:department];
[department addEmployee:employee];

// Save data to core data
[self saveAction];

这是我得到的错误:

      2010-04-08 16:06:11.295 Paparazzi2[2656:207] ERROR:saveAction. Unresolved Core Data Save error Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x3d1c6f0 "Operation could not be completed. (Cocoa error 1570.)", {
NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1570.)";
NSValidationErrorKey = department;
NSValidationErrorObject = <Employee: 0x3d13a30> (entity: Employee; id: 0x3d16670 <x-coredata:///Employee/t8C950118-C388-4020-8CD9-1F49138A94193> ; data: {
picture = "mike.jpg";
name = "Mike Smith";
department = nil;

});}

谢谢,祖尔。

最佳答案

嘿,Tzur,您提供的代码的一个问题是您尝试为部门关系分配一个不是托管对象的值。

您应该首先创建 Department 对象(如果该对象尚不存在),然后使用该对象作为部门关系的值。

我会替换这一行:

[employee setDepartment:[object valueForKey:@"department"]];

这样:

Department *myDepartment = [self fetchDepartmentNamed:[object objectForKey:@"department"]
inManagedObjectContext:[self managedObjectContext]];
if (!myDepartment) {
/* no existing department with that name.. create one */
myDepartment = (Department *)[NSEntityDescription insertNewObjectForEntityForName:@"Department" inManagedObjectContext:[self managedObjectContext]];
[myDepartment setName:[object objectForKey:@"department"]];
}
/* assign the relationship to the department managed object */
[employee setDepartment:myDepartment];

这假设您已经定义了一个方法 -(Department *)fetchDepartmentNamed:inManagedObjectContext:] ,该方法将构建一个提取请求并获取具有您提供的名称的部门(还假设您的部门名称是唯一的) )

或者,您可以将员工添加到 myDepartment 的“员工”关系中,这将获得相同的结果。

<小时/>

好的,您已经更新了代码,现在您拥有了:

// Set relationship
[employee setDepartment:department];
[department addEmployee:employee];

你应该做其中之一……而不是两者都做。检查托管对象模型是否已为两个实体选择了关系的“反向:”。如果您设置其中一种关系,Core Data 将管理该关系的反向(相反)关系。

关于iphone - 如何设置从一个对象到另一个对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2590598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com