我有几张桌子:
User:
- userId (NString)
- name (NSString)
Report:
- reportName (NSString)
- user (foreign key to user table)
我有一个userId,我想获得该用户的所有报告。我是否必须先从核心数据中查询用户?
如果是这样,这很糟糕,因为我试图通过apple实现查找和更新逻辑。在我的情况下,我每个用户只有一个报告。我从服务器返回一系列报告,每个报告包含一个userId(由服务器分配)。如果我没有该用户的报告,我需要创建一个。如果我有该用户的报告,我需要使用新报告进行更新。
所以基本上我创建了一个NSString(userId' s)数组,用于谓词:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Report" inManagedObjectContext:context]];
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:@"(userId IN %@)", userIds]];
但是在这种情况下,userId确实不存在,用户是外来关系。
我无法建立外来关系,只是将userId存储在报告中,但之后我需要手动加入。这是一个更好的选择。
答案 0 :(得分:1)
核心数据中不存在外键的概念。当然,它们可用于其中一个可能的后备存储,但外键是隐藏的。取而代之的是我们的关系。
如果您建立了关系,那么您只需走一条关键路径即可。不需要进一步提取。
你需要逆转你的人际关系。因此,如果报告具有用户,则用户具有报告。
出于您的目的,我建议实施reportWithReportName:
(执行获取),findOrCreateWithReportName:
(尝试获取,必要时执行插入),userWithUserID:
(执行获取),和findOrCreateUserWithUserID:name:
(如果需要,提取,插入)。
Report *aReport;
User *someUser;
NSLog(@"%@", aReport.user.name, aReport.user.userID);
NSLog (@"%@", someUser.userID, someUser.reports);
foreach (Report *report in someUser.reports) {
NSLog(@"%@", report.reportName);
}