Ios 基于FK中的值的查询表

Ios 基于FK中的值的查询表,ios,core-data,foreign-key-relationship,predicate,Ios,Core Data,Foreign Key Relationship,Predicate,我有两张桌子: User: - userId (NString) - name (NSString) Report: - reportName (NSString) - user (foreign key to user table) 我有一个用户ID,我想获取该用户的所有报告。我必须首先从核心数据查询用户吗 如果是这样的话,这是不好的,因为我正试图实现查找和更新逻辑,正如苹果公司概述的那样。在我的例子中,每个用户只有一个报告。我从服务器返回一个报告数组,每个报告都包含一个

我有两张桌子:

User:
  - userId (NString)
  - name (NSString)

Report: 
  - reportName (NSString)
  - user (foreign key to user table)
我有一个用户ID,我想获取该用户的所有报告。我必须首先从核心数据查询用户吗

如果是这样的话,这是不好的,因为我正试图实现查找和更新逻辑,正如苹果公司概述的那样。在我的例子中,每个用户只有一个报告。我从服务器返回一个报告数组,每个报告都包含一个用户ID(由服务器分配)。如果我还没有该用户的报告,我需要创建一个。如果我有该用户的报告,我需要用新报告更新

因此,基本上我创建了一个NSString(userId)数组,用于谓词:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Report" inManagedObjectContext:context]];
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:@"(userId IN %@)", userIds]];
然而,在这种情况下,userId实际上并不存在,用户是一个外来关系


我无法建立外部关系,只能将userId存储在报告中,但稍后我需要手动加入。这是更好的选择吗

核心数据中不存在外键的概念。当然,它们用于一个可能的备份存储,但是外键是隐藏的。取而代之的是我们的关系

如果你已经建立了关系,你只需走关键路线。无需进一步提取

你的关系需要相反的结果。因此,如果一个报表有一个用户,该用户就有报表

出于您的目的,我建议实现一个
reportWithReportName:
(执行提取)、
findOrCreateWithReportName:
(尝试提取,必要时执行插入)、
userWithUserID:
(执行提取)和
findOrCreateUserWithUserID:name:
(提取,必要时插入)


您能澄清一下,报表上的
user
是核心数据关系还是SQL风格的外键吗?您可以用两种方式引用它。对不起,这是一种核心数据关系。这让我觉得很陌生,很困惑;)是的,现在你概括起来似乎很容易;)获取用户并使用反向关系更新报告。谢谢
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);
}