Ios 将mysql查询传输到NSPredicate

Ios 将mysql查询传输到NSPredicate,ios,objective-c,nspredicate,Ios,Objective C,Nspredicate,我正在编写mysql查询,它可以正确地获取信息,但我无法为此编写NSPredicate,因为我不知道如何在select构造中进行选择 SELECT * FROM ZPHOTO WHERE ZPHOTOID IN (SELECT ZALBUMID FROM ZPHOTO) AND ZALBUMID = 0; 我获取所有行,其中albumID=0,如果albumID包含此photoID 以及我的部分预测: NSEntityDescription *entity = [NSEntityDescrip

我正在编写mysql查询,它可以正确地获取信息,但我无法为此编写NSPredicate,因为我不知道如何在select构造中进行选择

SELECT * FROM ZPHOTO WHERE ZPHOTOID IN (SELECT ZALBUMID FROM ZPHOTO) AND ZALBUMID = 0;
我获取所有行,其中albumID=0,如果albumID包含此photoID

以及我的部分预测:

NSEntityDescription *entity = [NSEntityDescription entityForName:[NSString stringWithFormat:@"%@",name] inManagedObjectContext:context];
etchRequest.predicate = [NSPredicate predicateWithFormat:@"photoId IN"]
更新: 逻辑: 有一个表:。我需要返回albumId=0的行,如果在albumId实体中找到该行的photoId。在本例中,我需要返回第一行。 逻辑:如果albumId=0,则为album,如果albumId!=0,这意味着,该照片属于第1张相册。所以我需要返回所有相册,其中的照片数量不是零。 使用这个谓词,我只返回所有相册,也返回没有照片的相册

"albumId = 0"
所以我需要过滤没有照片的相册。 请帮帮我

更新内容2:

返回任何没有照片的行,我认为%@中的photoId有问题,我认为他在ZPK中找到了,而不是在albumId实体中

        NSFetchRequest *fr = [[NSFetchRequest alloc]init];
        fr.predicate = [NSPredicate predicateWithFormat:@"albumId != %i",statSubId]; // != 0
        [fr setEntity:entity];

        NSError *error;
        NSArray *albumIds = [context executeFetchRequest:fr error:&error];

        NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"photoId" ascending:YES];
        [fr setSortDescriptors:[NSArray arrayWithObject:sort]];

        fetchRequest.predicate = [NSPredicate predicateWithFormat:@"photoId IN %@ AND albumId == %i", albumIds,statSubId];
更新3

这似乎是一个有效的解决方案。谢谢你们

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"albumId != %i",statSubId]; // != 0

NSError *error;
NSArray *albumIds = [context executeFetchRequest:fetchRequest error:&error];

NSMutableArray *albId = [NSMutableArray array];
for (Photo *photo in albumIds) {
    [albId addObject:photo.albumId];
}

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"photoId IN %@ AND albumId == %i", albId,statSubId];
你可以用这个:

NSPredicate *compoundPredicate = [NSPredicate predicateWithFormat: @"photoId IN(albumId FROM Photo)"]; 
NSPredicate *markPredicate     = [NSPredicate predicateWithFormat: @"ZALBUMID = 0"];
NSPredicate *finalPredicate    = [NSCompoundPredicate andPredicateWithSubpredicates:
                                     @[compoundPredicate, markPredicate]];

我认为没有一种方法可以通过单个核心数据获取请求来实现这一点。 您必须分两步执行此操作:

获取albumId为的所有对象!=0并将生成的ID存储在数组AlbumID中。 使用谓词

[NSPredicate predicateWithFormat:@"albumId == 0 AND photoId IN %@", albumIds]
为了得到你想要的结果


如果您描述如何定义照片实体、属性和关系,会有所帮助。您定义了哪些核心数据实体?照片、相册。。。?它们有什么属性请注意,核心数据使用实体之间的关系,而不是ID或外键。可能是您将SQL表逐字翻译成了核心数据。关于photo,我只有一个实体,即photo和定义的属性photoId、albumId,即NSNumber、title和text。我从服务器上获取照片信息,无法更改结构,他们向我发送这样的信息。在这个结构上,我已经完成了所有应用程序,这是最后一件事。此外,我还有实体Stat,其中有statId和statSubId,并像处理照片一样工作,但我不需要过滤这些页面。我得到了这个错误:无法从照片解析格式字符串photoId INalbumId。我认为,在谓词中使用FROM是不正确的。@gronzz:如果我们不知道实体是如何定义的,几乎不可能为您的问题提供正确的解决方案。有一个表:我需要返回albumId=0的行,如果在albumId实体中找到该行的photoId。在本例中,我需要返回第一行。或者您只需要所有不是0的albumId吗?在当前页面上,我只需要显示albumId,所以查找albumId=0hm的行,这很奇怪,但有一些属性没有albumId!=0@gronzzz:对不起,我不明白你最后的评论。如果我的答案不起作用,那么让我知道,我会尽力帮助你。好吧,看来我不是最好的,而是一个有效的解决方案。我在更新的3中发布了这个,谢谢你的想法!