代码之家  ›  专栏  ›  技术社区  ›  Corey Floyd

如何正确配置nsfetchedresultsController

  •  6
  • Corey Floyd  · 技术社区  · 16 年前

    我在代码中放置了一个nsfetchedresultscontroller,这样我就可以对表视图数据进行很好的自动分区。

    所以我要做一个测试来确保一切正常。我的持久性商店里只有一个图书实体。我将首先执行旧方法获取,然后尝试使用nsfetchedresultsController。这两个代码块之间的差别只有两行。

    代码 没有 输入结果控制器:

     NSFetchRequest *request = [[NSFetchRequest alloc] init];
     NSEntityDescription *entity = [NSEntityDescription entityForName:kBookEntityName inManagedObjectContext:self.managedObjectContext];
     [request setEntity:entity];
    
     NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO];
     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
     [request setSortDescriptors:sortDescriptors];
     [sortDescriptor release];
     [sortDescriptors release];
    
      //The following 2 lines will be replaced by the NSFetchedResultsController
     NSMutableArray *mutableFetchResults = [[[self.managedObjectContext executeFetchRequest:request error:nil] mutableCopy] autorelease];
     Book *result = (Book*)[mutableFetchResults objectAtIndex:0];
    
     NSString* title = [result valueForKey:@"title"];
     NSString* priority = [result valueForKeyPath:@"priority.name"];
    
    
     [request release];
    

    现在,我用行替换nsfetchedresultscontroller:

    NSFetchedResultsController* fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"];                                                                                                                                                                                                                                                                                                           
    
    Book *result = (Book*)[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    

    看起来很干练。第一个代码块正确地获取单个图书实体。但是,带有nsfetchedresultsController的代码没有。相反,它返回零。

    我的问题是:在这个例子中,我是否正确地配置了nsfetchedresultscontroller?

    (注意,nsfetchedResultsController的FetchedObjects属性也为零)

    2 回复  |  直到 16 年前
        1
  •  13
  •   David Maymudes    16 年前

    我想你还是需要告诉 NSFetchedResultsController 要实际执行提取,请执行以下操作:

    NSError *error;
    BOOL success = [controller performFetch:&error];
    

    (摘自 未保存的结果控制器 参考文献)

    还有一件事似乎很奇怪:你真的想用“标题”作为 sectionNameKeyPath ?这基本上不会为每本书创建一个单独的部分吗?

        2
  •  7
  •   Massimo Cafaro    16 年前

    您只需要初始化一次nsfetchedresultsController,如下所示。

    NSFetchedResultsController *fetchedResultsController;
    NSManagedObjectContext *managedObjectContext;
    

    在控制器的头中声明,并且ManagedObjectContext已正确初始化。

    - (void)viewDidLoad {
    
        [super viewDidLoad];
    
        NSError *error;
        if (![[self fetchedResultsController] performFetch:&error]) {
            // Handle error
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    
        }
    
        NSLog(@"%d objects fetched", [[fetchedResultsController fetchedObjects] count]);
    }
    
    - (NSFetchedResultsController *)fetchedResultsController {
    
        if (fetchedResultsController != nil) {
            return fetchedResultsController;
    
        }
    
        /*
         Set up the fetched results controller.
         */
    
    
    
        // Create the fetch request for the entity.
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        // Edit the entity name as appropriate.
        NSEntityDescription *entity = [NSEntityDescription entityForName:kBookEntityName inManagedObjectContext:self.managedObjectContext];
        [request setEntity:entity];
    
    /* Optional settings
    
        [request setResultType:NSManagedObjectResultType];
        [request setIncludesPropertyValues:YES];
        [request setIncludesPendingChanges:NO];
        [request setReturnsObjectsAsFaults:NO];
    */  
    
    
        // Edit the sort key as appropriate.
         NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO];
     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
     [request setSortDescriptors:sortDescriptors];
     [sortDescriptor release];
     [sortDescriptors release];;
    
        // Edit the section name key path and cache name if appropriate.
        // nil for section name key path means "no sections".
        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"];
        aFetchedResultsController.delegate = self;
        self.fetchedResultsController = aFetchedResultsController;
    
        [aFetchedResultsController release];
        [request release];
    
    
        return fetchedResultsController;
    }