将 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