【问题标题】:Core data doesn't fetch objects核心数据不获取对象
【发布时间】:2013-02-09 19:30:19
【问题描述】:

您好,这是我的 NSFetchedResultsController 实现:

-(NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }
    NSLog(@"context - %@",self.context);
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Categories" inManagedObjectContext:self.context];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"name" ascending:YES];
    [fetchRequest setSortDescriptors:@[sort]];

    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:self.context sectionNameKeyPath:nil
                                                   cacheName:@"root"];
    _fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
//    [[self context] fetchObjectsForEntityName:@"Categories" withPredicate:
//     nil] ;
    return _fetchedResultsController;
}

fetchedResultsController.fetchedObjects 始终为零。 这是我添加对象的方式:

-(void)addCategoryWithName:(NSString *)name
{
    NSLog(@"context - %@",self.context);
    Categories *category = (Categories *)[NSEntityDescription insertNewObjectForEntityForName:@"Categories" inManagedObjectContext:self.context];
    category.name = name;
    NSLog(@"category name - %@",category.name);
    category.displayOrder = [NSNumber numberWithFloat:1.0f];
    //        site.displayOrder = displayOrder;

    NSError __block *error;
    if (![self.context save:&error]){
        NSLog(@"Error saving - %@", [error localizedDescription]);
    }
}

没有错误,没有什么。如果我在 Documents 目录中看到我的 .sqlite 文件,它已被修改,但我无法获取任何对象。真的很奇怪,我在我的其他应用程序中使用基本相同的代码,它工作得很好。

有什么想法吗?

【问题讨论】:

  • 你在某个地方打电话给performFetch吗? - 如果sectionNameKeyPath = nil,我也不会指定cacheName
  • 完全忘记了 performFetch。它似乎有一段时间没有编程有它的效果。但是在这里学到了很好的经验,谢谢!只有一个问题 - 为什么在 sectionNameKeyPath 为 nil 时不指定缓存?
  • 我会把它放到我的答案中......

标签: iphone ios core-data


【解决方案1】:

您必须在获取的结果控制器上调用一次performFetch。否则它不会获取任何东西,也不会跟踪更改。例如添加

NSError *error;
if (![_fetchedResultsController performFetch:&error]) {
    // error handling
}

fetchedResultsController getter 方法的末尾。

备注: 似乎在没有sectionNameKeyPath 的情况下指定cacheName 会导致问题,请参阅UITableView with NSFetchedResultsController Does Not Load the Second Time。由于缓存用于缓存部分信息,因此如果您没有部分,则无论如何都不需要它。

更新:前面的评论已经失效了,原来是链接问题中的问题有不同的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多