晚上好,

我需要有关Core Data的帮助。我有两个实体,即图像和相册(代码中为ImageGroup),它们具有多对多关系。每个图像可以有很多相册,而一个相册可以有很多图像。

在应用程序中,用户可以创建一个相册。创建相册后,所有新图片都会添加到该相册中。一切正常。

但是现在我对核心数据中的提取请求有疑问。请查看我当前的“提取”代码:

NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSError *error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ImageGroup" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];

// Load all the other albums
for (ImageGroup *group in fetchedObjects) {
    NSString *albumName = group.name;
    NSSet *groupSet = group.group;
    for (Images *image in groupSet) {
        NSLog(@"imageTN: %@", image.nameTN);
    }
}


这也很好。但是,在groupSet的“ for in”循环中,将为循环中的每个步骤执行一个选择查询。如果您只有几个图像,这很好,但是,如果存储了1000多个图像,此代码将执行1000多个查询。

有没有一种方法可以在一个查询中加载与相册相关的所有图像?
(从图像WHERE album_ID =?中选择*就是这样)。

这是我第一次使用Core Data,而不是sqlite。任何帮助,我们都感激不尽。

最佳答案

这是可能的,如果您没有遍历该集合,或者您预取了group中的图像(由于当前的提取请求将提取所有ImageGroup实体,则您应该避免这种情况)。

要预取一对多关系,请添加到您的请求中:
[fetchRequest setRelationshipsForPrefetching:@[@"group"]]
我还要补充:
[fetchRequest setIncludesPropertyValues:YES]和:
[fetchRequest setReturnsObjectsAsFaults:NO]

如果要每个ImageGroup发出单个请求,则可以使用:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Images"];
[fetchRequest setIncludesPropertyValues:YES]
[fetchRequest setReturnsObjectsAsFaults:NO]
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"%@ IN <albom set>",group.objectID]; //not tested


注意:到外部循环结束时,您已经错误(分配在内存中)所有相册及其所有附加图像。
您应该对完成的每个ImageGroup进行故障处理,以防止出现内存不足。

10-06 13:24