它比你想象的要复杂,但也不是不可能。
您的数据模型lib_id
在两个实体上的使用,以及您无法在实体之间添加 Core Data 关系的评论表明您陷入了一个经典陷阱:您将 Core Data 视为关系数据库。Core Data 的 API 不像关系数据库那样设计。你可以让它工作,但你应该意识到你正在竭尽全力让 Core Data 变得比必要的更困难。如果下面的解决方案看起来很复杂,那是因为你在做 Core Data 错误。
如果您使用 Core Data 的预期用途——在这种情况下是两个实体之间的关系——查找会很简单。您可以为每个Library
在其books
关系中没有条目的情况进行提取。
话虽如此,您分两步解决眼前的问题。
首先,获取lib_id
在Books
. 以下将为您提供NSArray
与唯一值匹配的包含字符串:
NSFetchRequest *bookRequest = [NSFetchRequest fetchRequestWithEntityName:@"Books"];
[bookRequest setPropertiesToFetch:@[@"lib_id"]];
[bookRequest setResultType:NSDictionaryResultType];
[bookRequest setReturnsDistinctResults:YES];
NSError *error = nil;
NSArray *libIdsInBooksDicts = [[self managedObjectContext] executeFetchRequest:bookRequest error:&error];
if (libIdsInBooksDicts == nil) {
NSLog(@"Fetch error: %@", error);
return;
}
NSArray *libIdsInBooks = [libIdsInBooksDicts valueForKey:@"lib_id"];
上面的最后一行是因为libIdsInBooksDicts
实际上包含一个字典数组,而每个字典又都有一个名为的键lib_id
和一个作为实际 ID 的值。您只需要这些值。
接下来,查找刚刚获得的列表中的每个Library
人:lib_id
NSFetchRequest *libRequest = [NSFetchRequest fetchRequestWithEntityName:@"Library"];
[libRequest setPredicate:[NSPredicate predicateWithFormat:@"lib_id in %@", libIdsInBooks]];
error = nil;
NSArray *librariesWithAtLeastOneBook = [[self managedObjectContext] executeFetchRequest:libRequest error:&error];
if (librariesWithAtLeastOneBook == nil) {
NSLog(@"Fetch error: %@", error);
return;
}