晚上好,
我需要一些Core Data的帮助。我有两个实体,图像&相册(代码中的ImageGroup),具有多对多关系。每个图像可以有许多相册,而相册可以有许多图像。
在应用程序中,用户可以创建相册。创建相册后,所有新图片都会添加到该相册中。这工作正常。
但现在我对Core Data中的获取请求有疑问。请查看我当前的“获取”代码:
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”循环期间,将为循环中的每个步骤执行select查询。如果您只有几张图片,这很好,但是,如果您存储了1000多张图片,此代码将执行1000多个查询。
有没有办法在一个查询中加载与相册相关联的所有图像? (SELECT * from Images WHERE album_ID =?类似的东西。)
这是我第一次使用Core Data而不是sqlite。真的很感激任何帮助。
答案 0 :(得分:1)
这是可能的,如果你没有通过集合,或者你在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
犯下错误,以避开记忆。