首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Coredata和NSFetchRequest进行"IN“搜索时如何格式化NSFetchRequest

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

Stack Overflow用户
提问于 2013-08-16 12:01:47
回答 1查看 982关注 0票数 0

我有一个非常简单的提取请求,我想要执行。我的一个实体有一个名为smartCollectionIds的属性,它的类型是可转换的。我使用这个属性来存储一个简单字符串的NSArray。在我的代码中,我使用一个NSfetchedResultsController来填充一个表视图。谓词im使用如下:

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

然而,这会导致崩溃,特别是在我执行提取时的品脱。但是,如果我首先使用fetch将所有对象加载到数组中,然后使用上面的谓词过滤掉它们,则应用程序不会崩溃,我将得到预期的结果。因此,基本上下面的代码不工作

代码语言:javascript
复制
-(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);

}

}

,但这能工作,

代码语言:javascript
复制
  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;
  }
 }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-16 12:12:20

带有谓词的核心数据获取请求被转换为SQLite查询,并在SQLite级别上执行。可转换数组存储为SQLite数据库中的某个blob,因此在获取请求中将其作为数组处理不起作用。

如果首先获取元素,则在访问属性时,blob将被转换回数组。因此,过滤获取对象的数组就像预期的那样工作。

我不认为有什么解决办法。在获取请求中,不能对可转换属性进行筛选。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18272876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档