【问题标题】:Core Data: unnecessary queries?核心数据:不必要的查询?
【发布时间】:2013-04-30 06:21:18
【问题描述】:

晚上好,

我需要一些有关 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”循环期间,会为循环中的每个步骤执行选择查询。如果您只有几张图片,这很好,但是,如果您存储了 1000 多张图片,则此代码将执行 1000 多次查询。

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

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

【问题讨论】:

    标签: ios database core-data


    【解决方案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,以防止内存偷看。

    【讨论】:

    • 谢谢丹,帮了大忙!我还可以 [group.group allObjects] 在单个查询中加载所有图像(在 fetchedObjects 的 for in 循环中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    相关资源
    最近更新 更多