将 NSPredicate 设置为 NSFetchRequest 后 executeFetchRequest 崩溃

Posted

技术标签:

【中文标题】将 NSPredicate 设置为 NSFetchRequest 后 executeFetchRequest 崩溃【英文标题】:executeFetchRequest Crashing after setting NSPredicate to NSFetchRequest 【发布时间】:2014-12-08 00:23:21 【问题描述】:

我真的被这个问题困住了,我将生锈的 SQL / REGEX 归咎于这个问题,但我希望你能提供帮助。

我有这个 CoreData 实体:

@interface Movie : NSManagedObject

@property (nonatomic, retain) id genreArray;
@property (nonatomic, retain) NSNumber * imdbID;
@property (nonatomic, retain) NSNumber * isPlaying;
@property (nonatomic, retain) NSNumber * isPromo;
@property (nonatomic, retain) NSNumber * isTickets;
@property (nonatomic, retain) NSDate * lastUpdate;
@property (nonatomic, retain) NSNumber * movieID;
@property (nonatomic, retain) NSString * movieName;
@property (nonatomic, retain) NSString * movieName_EN;
@property (nonatomic, retain) id movieOtherNames;
@property (nonatomic, retain) NSString * posterPicture;
@property (nonatomic, retain) etcetcetc;

@结束

所以,我想按 NAME 搜索电影。问题是名称可以在movieName 或movieName_EN 下,也可以在数组movieOtherNames 中的其中一个名称中。

目前,我徒劳的请求是这样的:

    Movie* movie = nil;

    NSEntityDescription *allMovs = [NSEntityDescription entityForName:@"Movie"
                                                inManagedObjectContext:[self mainManagedObjectContext]];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:allMovs];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                        initWithKey:@"premiereDate" ascending:NO];
    [request setSortDescriptors:@[sortDescriptor]];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"$movieName contains[cd] %@ OR %@ contains[cd] $movieName OR $movieName_EN contains[cd] %@ OR  %@ contains[cd] $movieName_EN OR ANY $movieOtherNames MATCHES %@", movieName, movieName, movieName, movieName, movieName];
    [request setPredicate:predicate];
    NSError *error;
    NSArray* moviesArray = [[self mainManagedObjectContext] executeFetchRequest:request error:&error];
    if(error)
        SRTLog(@"CoreData: NO movieTimes! Deal with error...");
    if([moviesArray count] > 0)
        movie = [moviesArray objectAtIndex:0];
    return movie;

执行此代码时,我的应用程序崩溃了。我的猜测是 NSPredicate。那里出了点问题。

任何人都可以帮助我了解如何搜索可以包含(或包含)在 2 个字段和字符串数组中的字符串吗?

我会为任何愿意提供帮助的好心人更新 Stack OverFlow。

【问题讨论】:

你不应该使用 LIKE 而不是 CONTAINS 吗? 仅供参考,你的谓词的问题是'%@ contains[cd] $movieName'(和类似的)。你会发现几个关于 SO 试图解决这个问题的问题;没有一个成功的。这里有一些解决方法:Writing an NSPredicate for CONTAINED_BY 【参考方案1】:

我认为你的这个谓词有点错误。如果它解决了问题,请尝试执行此操作。如果没有,请添加一些错误描述和确切的行。

我希望代码本身是不言自明的:

    NSString *movieName = @""; // get the true name value
    NSArray *predicateCompounds = @[
                                    [NSPredicate predicateWithFormat:@"movieName LIKE[cd] %@", movieName],
                                    [NSPredicate predicateWithFormat:@"%@ LIKE[cd] movieName", movieName],
                                    [NSPredicate predicateWithFormat:@"movieName_EN LIKE[cd] %@", movieName],
                                    [NSPredicate predicateWithFormat:@"%@ LIKE[cd] movieName_EN", movieName]
                                    ];
    NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicateCompounds];

【讨论】:

嗨@Matic Oblak:感谢您与我的问题有关。我尝试了您的代码,但是当我尝试执行请求时它仍然崩溃。此外,您没有包括我如何在“movieOtherNames”数组中搜索。谢谢。 此行出现错误:NSArray* moviesArray = [[self mainManagedObjectContext] executeFetchRequest:request error:&error]; 你是否得到任何错误信息?也许你只是拼错了一些东西。日志说什么? 嗨@Matic Oblak,再次感谢。好吧...我在它写的线程上看不到错误:[NSManagedObjectContext executeFetchRequest:error:] () 我对这个兄弟一无所知:s 您很可能需要一些努力来调试它。仔细检查所有名称是否正确,尝试获取不带谓词的对象,然后开始添加谓词化合物以查看导致崩溃的部分。

以上是关于将 NSPredicate 设置为 NSFetchRequest 后 executeFetchRequest 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为 NSFetchedResultsController 设置 NSPredicate

如何将 NSPredicate 应用于自定义 XLForm 行?

使用短语和数字序列设置 NSPredicate

NSPredicate 用于查询中的位置

日期的核心数据 NSPredicate

NSfetch 请求返回相同的数据总是不返回更新的数据