0

晚上好,

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

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

但现在我对 Core Data 中的 fetch 请求有疑问。请看一下我当前的“获取”代码:

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 多个查询。

有没有办法在一个查询中加载与相册关联的所有图像?(SELECT * from Images WHERE album_ID = ? 类似的东西)。

这是我第一次使用 Core Data 而不是 sqlite。任何帮助都非常感谢。

4

1 回答 1

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一项工作都进行错误处理,以防止内存偷窥。

于 2013-04-30T06:59:21.960 回答