gpt4 book ai didi

objective-c - 核心数据:在两个实体中查找的NSPredicate

转载 作者:行者123 更新时间:2023-12-01 17:26:42 27 4
gpt4 key购买 nike

问题是我不知道如何制作在两个实体中显示的NSPredicate。有任何想法吗?

假设我有2个实体:

Library:
1 lib_id
2 name
3 address

和:
Books
1 book_id
2 book_name
3 book_author
4 lib_id

它们之间没有任何核心数据关系。我想发出一个获取请求,该请求将返回包含至少一本书的所有库的NSArray。

我认为是这样的:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescriptor *entity = [NSEntityDescriptor entityForName:@"Books" inManagedObjectContext:context];
// some NSPredicate...
array = [context executeFetch ...];

最佳答案

它比您想象的要复杂,但这并非不可能。

您的数据模型在两个实体上都使用了lib_id,并且您的注释是您无法在实体之间添加Core Data关系,这表明您陷入了一个典型陷阱:您正在将Core Data视为关系数据库。 Core Data的API并非像关系数据库那样设计。您可以通过这种方式使其工作,但是您应该意识到会让您变得比需要的更加困难。如果下面的解决方案看起来很复杂,那是因为您做错了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;
}

关于objective-c - 核心数据:在两个实体中查找的NSPredicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14154555/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com