如何使用Coredata和NSFetchRequest进行"IN"搜索时格式化NSPredicate

dub*_*ike 0 core-data objective-c nspredicate nsfetchrequest ios

我有一个非常简单的获取请求,我想执行.我的一个实体有一个名为smartCollectionIds的属性,它的类型是可转换的.我使用此属性来存储一个NSArray简单的字符串.在我的代码中,我使用an NSfetchedResultsController来填充tableview.我使用的谓词如下:

predicate=[NSPredicate predicateWithFormat:@"smartCollectionIds!=nil && (%@ IN smartCollectionIds)",@"87F173A5-863D-4ECE-9673-A61D8F1E01FC-6285-000009A9CBAF3290"];
Run Code Online (Sandbox Code Playgroud)

但是这会导致崩溃,特别是在我执行提取时的品脱.但是,如果我首先使用fetch将所有对象加载到数组中,然后使用上面的谓词将其过滤掉,那么应用程序不会崩溃,我会按预期获得结果.所以基本上 这个代码不起作用

-(void) tryTO
{
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Tweetary" inManagedObjectContext: [[ChubbyEyetwitterEngine sharedInstance] getManagedObjectContextForUse]];

NSPredicate *predicate;

predicate=[NSPredicate predicateWithFormat:@"smartCollectionIds!=nil && (%@ IN smartCollectionIds)",@"87F173A5-863D-4ECE-9673-A61D8F1E01FC-6285-000009A9CBAF3290"];

NSSortDescriptor *secondarySortKey = [[[NSSortDescriptor alloc] initWithKey:@"created_at" ascending:FALSE] autorelease];

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease] ;
[request setEntity:entity];
[request setPredicate:predicate];
[request setSortDescriptors:[NSArray arrayWithObjects:
                             secondarySortKey
                             ,nil]];
[request setFetchLimit:30];  //30


NSError *error;

NSArray *results = [[[ChubbyEyetwitterEngine sharedInstance] getManagedObjectContextForUse] executeFetchRequest:request error:&error];

if (error != nil)
{
     NSLog(@"Results are %d",[results count]);

}else{
    NSLog(@"findAllObjectsInContext error %@",error);

}
Run Code Online (Sandbox Code Playgroud)

}

但是这个工作

  NSArray *tweets = [Tweetary findAllObjectsInContext:[[ChubbyEyetwitterEngine sharedInstance] getManagedObjectContextForUse]];

NSLog(@"Before filter count is %d",[tweets count]);

predicate=[NSPredicate predicateWithFormat:@"smartCollectionIds!=nil && (%@ IN smartCollectionIds)",@"87F173A5-863D-4ECE-9673-A61D8F1E01FC-6285-000009A9CBAF3290"];

predicate=[NSPredicate predicateWithFormat:@"smartCollectionIds!=nil && (%@ IN smartCollectionIds)",@"87F173A5-863D-4ECE-9673-A61D8F1E01FC-6285-000009A9CBAF3290"];

NSArray *bNames = [tweets filteredArrayUsingPredicate:predicate];

NSLog(@"FINAL Results %d",[bNames count]);



+ (NSArray *)findAllObjectsInContext:(NSManagedObjectContext *)context;
  {


 @synchronized(self){

NSEntityDescription *entity = [self entityDescriptionInContext:context];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entity];
NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];
if (error != nil)
{
    //handle errors
    //NSLog(@"findAllObjectsInContext error %@",error);
}
return results;
  }
 }
Run Code Online (Sandbox Code Playgroud)

简而言之,我需要我的fetch谓词在使用NSfetchedResultsController时工作,而不是先将我的对象加载到数组中,然后应用我的过滤谓词.任何人都可以指出我正确的方向/弄清楚为什么谓词只有在我将未经过滤的数据集加载到数组后才能工作?

Mar*_*n R 5

带有谓词的Core Data fetch请求被转换为SQLite查询并在SQLite级别执行.可转换数组作为一些blob存储在SQLite数据库中,因此在获取请求中将其视为数组不起作用.

如果首先获取元素,则在访问该属性时,blob将转换回数组.因此,过滤获取的对象数组按预期工作.

我认为没有任何解决方法.您无法在获取请求中过滤可转换属性.