【问题标题】:Core Data Relationships fetch核心数据关系获取
【发布时间】:2026-01-08 09:10:01
【问题描述】:

好的,我以为我有这个,但我没有得到我期望的结果。希望有人可以提供帮助。

我有两个实体 Person 和 Timesheet ,它们具有一对多的关系: Person.timesheet>Timesheet.user。 下面的代码有效,但是当我尝试添加第二个时间表条目时,它似乎覆盖了第一个?

我查看了 Apple Docs,他们在这个主题上有点模糊。

//Add

NSManagedObjectContext *context = self.managedObjectContext;
Person *personAdded = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
Timesheet *timesheet = [NSEntityDescription insertNewObjectForEntityForName:@"Timesheet" inManagedObjectContext:context];;
timesheet.time = @"10:00 Friday";
timesheet.timestamp = [NSDate date];

NSSet *timesheetSet = [NSSet setWithObject:timesheet];

personAdded.name = @"Darren";
personAdded.job = @"Job to be Done";
personAdded.timesheet = timesheetSet;

NSError *error = nil;
[context save:&error];

if (error) {
    NSLog(@"[ERROR] COREDATA: Save raised an error - '%@'", [error description]);
}

NSLog(@"[SUCCESS] COREDATA: Inserted new User to database!");

// Load

NSEntityDescription *personEntity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity: personEntity];

error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];

if (!results || error) {
    NSLog(@"[ERROR] COREDATA: Fetch request raised an error - '%@'", [error description]);
    [request release];
}
NSLog(@"Results: %@",results);

Person *firstUser = [results objectAtIndex:0];

NSLog(@"First User's name: %@",firstUser.name);
NSLog(@"First User's time %@",[[firstUser.timesheet anyObject] valueForKeyPath:@"timestamp"]);

我想知道这是否可能是因为我实际上是在使用 NSSet 而不是实际的表设置 Person.timesheet 键?或者可能是我没有正确调用结果?

谢谢, 达伦

【问题讨论】:

    标签: iphone ios4 core-data entity-relationship


    【解决方案1】:

    您的 Person.h 文件中应该有一个生成的“CoreDataGeneratedAccessors”方法,它为您提供了一个方法

    [personAdded addTimesheet:timesheetSet];
    

    哪个为您创建链接?

    Core Data 通常会为您定义的任何关系生成添加和删除方法。

    如果不清楚,请发布您的 person.h 文件。

    【讨论】:

    • 嘿,谢谢。我曾认为这些方法可能是答案,但我一直无法让它们发挥作用。在阅读了您的回复后,我又看了一遍,意识到我必须将方法添加到头文件中。一旦我这样做了,我就可以调用它,但是当我调用它时,我会收到一条警告,指出“NSSet”可能不会响应“addTimesheet:”。我查看了其余的代码,看起来一切都很好?任何想法
    • 现在一切都好,错误是我试图在 personAdded.timesheet 上运行该方法而不仅仅是添加的人。非常感谢您的解决方案,我很高兴事情就这么简单。