子查询谓词核心数据

Posted

技术标签:

【中文标题】子查询谓词核心数据【英文标题】:Subquery Predicate Core Data 【发布时间】:2015-04-06 10:28:05 【问题描述】:

我有两个实体模型“内容”和“课程内容”,它们之间没有关系。两个实体都具有 NSNumber 类型的共同属性“contentID”。我从给定谓词的“内容”实体中获取所有内容对象,并将这些对象存储在内容数组中。我成功地这样做了。 现在,我想从 contentIds 存在于内容数组中的“LessonsContent”实体中获取所有课程内容对象。

我正在使用以下代码:

    NSPredicate * predicate = [NSPredicate predicateWithFormat:@"(contentType == %@)", @"Games"];


    NSError * error;
    NSFetchRequest * request = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([Content class])];
    [request setPredicate:predicate];
    [request setReturnsObjectsAsFaults:NO];
    NSArray *contents = [[DELEGATE managedObjectContext] executeFetchRequest:request error:&error];

    if(error) NSLog(@"Error in fatching data");


    //predicate = [NSPredicate predicateWithFormat:@"Content.contentID IN %@", contents];

    predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(contents, $x, $x.Content.contentID IN %@).@count != 0)",contents];

    request = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([LessonsContent class])];
    [request setPredicate:predicate];
    NSArray * mappingArray = [[DELEGATE managedObjectContext] executeFetchRequest:request error:&error];
    NSLog(@"mappingArray %@", mappingArray);

但是应用程序崩溃了。请提出适当的解决方案。 提前致谢。

【问题讨论】:

在第二个谓词中使用 IN 子句。 [***][1] [1]:***.com/questions/6130900/… contentID 属性是 NSNumber 类型。我已经尝试过了,但它不起作用。 我会考虑使用NSCompoundPredicate 和方便的方法andPredicateUsingSubpredicates: 见here 【参考方案1】:

您必须首先获取一个 contentID 数组。然后使用 IN。

NSArray *contents = [[DELEGATE managedObjectContext] executeFetchRequest:request error:&error];

NSArray * allContentIDs = [contents valueForKey:@"contentID"];

然后使用第二个谓词

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"contentID IN %@", allContentIDs];

[request setPredicate:predicate];

希望这会有所帮助。

【讨论】:

以上是关于子查询谓词核心数据的主要内容,如果未能解决你的问题,请参考以下文章

流分析:源“子查询”只能用于使用“datediff”函数的时间谓词

BIGQUERY:连接谓词中的表不受支持的子查询

大查询:使用函数结果连接(错误:连接谓词中的子查询应该只依赖于一个连接端。)

数据库系统原理作业七数据查询中的嵌套查询

为啥我的子查询谓词中的 LIKE[c] 与此名称不匹配?

错误:当前子查询表达式仅允许作为配置单元中的 where 子句谓词