我有几个表:
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并不真正存在,user是一个外来关系。
我无法建立外部关系,只能将 userId 存储在报告中,但稍后我需要手动加入。那是更好的选择吗?
最佳答案
Core Data 中不存在外键的概念。当然,它们用于可能的后备存储之一,但外键是隐藏的。取而代之的是我们之间的关系。
如果你已经建立了关系,你就走关键路径。无需进一步提取。
你的人际关系需要反转。因此,如果报告有用户,则用户有报告。
为了您的目的,我建议实现一个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);
}
关于ios - 根据FK中的值查询表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24457416/