为啥不能两次获取相同的数据? NSFetchedResultsController 为空

Posted

技术标签:

【中文标题】为啥不能两次获取相同的数据? NSFetchedResultsController 为空【英文标题】:Why Can't Fetch The Same Data Twice? NSFetchedResultsController Is Empty为什么不能两次获取相同的数据? NSFetchedResultsController 为空 【发布时间】:2012-11-23 00:05:57 【问题描述】:

我正在尝试获取我的数据,但结果为空! 首先,我有一个表格,其中包含来自一个 NSFetchedResultsController 的数据。直到这里,我的代码是正确的,而且我知道我有数据。 但是,我过滤了那个 NSFetchedResultsController,所以我需要另一个 NSFetchedResultsController 没有过滤器的记录,我的意思是,我的所有记录。因此,我尝试使用另一个 NSFetchedResultsController 再次获取数据,使用相同的代码,但结果始终为空!!!。 这是我正在使用的功能:

+(NSFetchedResultsController*)fetchedResultsControllerForEntity:(NSString*)entityName titleKey:(NSString*)titleKey sectionNameKeyPath:(NSString*)sectionNameKeyPath

      NSFetchRequest *request=[self fetchRequestForEntity:entityName titleKey:titleKey sectionNameKeyPath:sectionNameKeyPath];    

      return [[[NSFetchedResultsController alloc] initWithFetchRequest:request 
                                            managedObjectContext:[self managedContext] 
                                            sectionNameKeyPath:sectionNameKeyPath 
                                            cacheName:[NSString stringWithFormat:@"%@.%@.%@",entityName,sectionNameKeyPath,titleKey]]autorelease];
 



+(NSFetchRequest *) fetchRequestForEntity:(NSString*)entityName titleKey:(NSString*)titleKey sectionNameKeyPath:(NSString*)sectionNameKeyPath

    NSFetchRequest *request=[[[NSFetchRequest alloc]init]autorelease];
    request.entity=[NSEntityDescription entityForName:entityName inManagedObjectContext:[self managedContext]];
    NSSortDescriptor* titleSortDescriptor=titleKey?[[NSSortDescriptor alloc ]initWithKey:titleKey ascending:YES]:nil;
    NSSortDescriptor* sectionSortDescriptor=sectionNameKeyPath?[[NSSortDescriptor alloc ]initWithKey:sectionNameKeyPath ascending:YES]:nil;
    NSMutableArray * sortDescriptors=[[NSMutableArray alloc]init];
    if(sectionNameKeyPath)
        [sortDescriptors addObject:sectionSortDescriptor];
        [sectionSortDescriptor release];
    
    if(titleKey)
        [sortDescriptors addObject:titleSortDescriptor];
        [titleSortDescriptor release];
    

    request.sortDescriptors=sortDescriptors;
    [sortDescriptors release];

    request.fetchBatchSize=20;
    return request;

我不明白,为什么如果我使用相同的代码,我的 NSFetchResultsController 是空的!!! 我试图从另一个实体中获取数据,但结果也是空的... 为什么我不见了? 谢谢

【问题讨论】:

方法名称前面的+ 看起来有问题。为什么要创建类方法? 因为我在另一个类中调用该函数。我把+改成了-,结果还是一样的…… 这完全没有意义。类方法被发送到类([MyClass method];),实例方法被发送到一个实例([myObject method];)。它甚至不应该编译。我的结论是你没有调用你认为你正在调用的方法。 它编译!!而且我已经找到了解决方案! 【参考方案1】:

只需使用相同的NSFetchedResultsController。只需更改其fetchRequest 属性以反映您想要获取的数据。例如,要获取给定实体的所有实例,请使用

self.fetchedResultsController.fetchRequest.predicate = nil;
[self.fetchedResultsController performFetch:&error]; 

如果您的NSFetchedResultsControllerDelegate 设置正确,您的表格视图应该会自行更新。

【讨论】:

感谢您的宝贵时间,但我不能使用相同的 NSFetchResultsController,因为一个用于表格(用于显示),而我需要另一个包含所有数据的原始数据,用于其他目的 然后只需创建第二个 ivar otherFetchedResultsController 并复制粘贴原始访问器的代码,只更改谓词并可能进行排序。【参考方案2】:

我已经解决了我的问题。只需为 NSFetchedResultsController 对象重新声明 SET 方法即可:

-(void)setFetchedItems:(NSFetchedResultsController *)newFetchedItems
    [fetchedItems release];
    fetchedItems=[newFetchedItems retain];
    [fetchedItems performFetch:NULL];

我想这就是为什么我的对象总是空的。因为对象

【讨论】:

以上是关于为啥不能两次获取相同的数据? NSFetchedResultsController 为空的主要内容,如果未能解决你的问题,请参考以下文章

2个相同容量的背包-为啥我们不能两次找到最大值

为啥 alloca 两次返回相同的地址?

为啥更新一个安卓应用可以让它出现两次?

为啥我在 Eclipse 中看到两次相同的课程

为啥相同的 CFLAGS 可以在 makefile 中重复两次?

为啥两次运行完全相同的正则表达式的结果不同? [复制]