ios - 根据FK中的值查询表

标签 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并不真正存在,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/

相关文章:

swift - 如何在 UITableView 中移动行后更新 CoreData?

ios - iCloud 核心数据不同步

ios - 使用示例核心数据进行单元测试

ios - 设置特定的 UITableViewCell 布局

ios - 特定 iOS 版本的 Swift 扩展

sql - 关系和多列/复合唯一键

c# - 为什么更新外键后引用约束不一致?

performance - FK 上的联接是否比没有 FK 的联接更快?

ios - 使用动态生成的数组来使用搜索栏

javascript - 通过绑定(bind)到 div 的 onclick 事件在 iPad 上加载 HTML5 视频