查询表基于FK中的值

时间:2014-06-27 17:13:48

标签: ios core-data foreign-key-relationship predicate

我有几张桌子:

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存储在报告中,但之后我需要手动加入。这是一个更好的选择。

1 个答案:

答案 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);
}