核心数据:表格视图获取对象的FRC数量为零

时间:2012-09-24 00:01:05

标签: ios core-data

我在两个表视图控制器中实现核心数据。第一个显示银行名称,城市和州,第二个显示银行的详细信息,如zip,截止日期等。因此我的模型中有两个实体。首先称为'BankInfo',第二个称为'BankDetails'。这两个实体是一对一的关系。

当我从第一个控制器转到第二个控制器时出现问题。看来第二个表视图控制器中的获取对象数始终为零。这意味着FRC什么都不拿。出了什么问题?

第一张表工作正常。我确信第二个实体正确地填充了数据。我尝试删除谓词,在这种情况下,FRC应该返回实体中的所有对象。但它仍然没有任何回报..

#import "SecondViewController.h"
#import "AppDelegate.h"

@interface SecondViewController () <NSFetchedResultsControllerDelegate>
@property (nonatomic,strong) NSFetchedResultsController *fetchedResultsController;
@end

@implementation SecondViewController
@synthesize bankInfo = _bankInfo;
@synthesize fetchedResultsController = _fetchedResultsController;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.fetchedResultsController.delegate = self;

    NSError *error;

    if (![self.fetchedResultsController performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }

    [self.tableView reloadData];

    NSLog(@"Frist fetched object is %@",[[self.fetchedResultsController fetchedObjects] objectAtIndex:0]);
}


- (void)setBankInfo:(BankInfo *)bankInfo
{
    _bankInfo = bankInfo;
}

- (NSFetchedResultsController *)fetchedResultsController
{
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"BankDetails"];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"info.state = %@",self.bankInfo.state];
    [request setPredicate:predicate];

    [request setSortDescriptors: [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"zip"
                                                                                    ascending:YES
                                                                                     ]]];
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = appDelegate.managedObjectContext;

    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

    return _fetchedResultsController;
}
// FRC delegate methods...
@end

1 个答案:

答案 0 :(得分:2)

每次调用时,你的getter函数fetchedResultsController都会创建一个新的FRC。

所以当你打电话

[[self.fetchedResultsController fetchedObjects] objectAtIndex:0]

然后调用fetchedResultsController,创建一个新的FRC,将其存储在_fetchedResultsController中,并返回新的FRC。由于此新FRC从未调用performFetch,因此fetchedObjects为空。代理人也没有为新的FRC设置。

同样的事情可能发生在表视图委托方法中。

通过在fetchedResultsController中设置断点或向该方法添加一些NSLog(),您可以轻松验证是否存在此问题。

您可能想要做的是懒惰的getter函数。设置委托并在该方法中执行提取也是有意义的。

- (NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController == nil) {
        /* ... create request, predicate, sort descriptor ... */
        _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
        _fetchedResultsController.delegate = self;
        [_fetchedResultsController performFetch:&error]; // error handling omitted
    }
    return _fetchedResultsController;
}

如果搜索条件发生变化,您只需设置_fetchedResultsController = nil即可强制创建新的FRC。