Попытка использовать NSFetchedResultsController для интеграции CoreData в мой UITableView, но не удается, как только приложение запускается

Я следовал этому руководству для T, но когда я запускаю свое приложение, оно каждый раз не запускается при запуске со следующей ошибкой:

* Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "+entityForName: nil не является допустимым параметром NSManagedObjectContext, который ищет имя объекта" ArticleInfo "".

Но я не могу понять, что я делаю неправильно, что могло бы вызвать это. В качестве фона для того, что я сделал, у меня есть файл модели данных с сущностью ArticleInfo с набором атрибутов разных типов (некоторые переходные, если это примечательно). Следуя совету этой статьи, я подкласс NSManagedObject как ArticleInfo,

Если это стоит отметить, я сделал preview, wordsInBody а также progress переходный процесс в датамоделе (и я дал position значение по умолчанию 0 в инспекторе моделей данных). Итак, в подклассе я сделал пользовательские геттеры следующим образом:

- (NSString *)preview {
    [self willAccessValueForKey:@"preview"];
    NSString *preview = [self primitiveValueForKey:@"preview"];
    [self didAccessValueForKey:@"preview"];

    if (self.body.length < 200) {
        preview = self.body;
    }
    else {
        preview = [self.body substringWithRange:NSMakeRange(0, 200)];
    }

    return preview;
}

- (NSNumber *)progress {
    [self willAccessValueForKey:@"progress"];
    NSNumber *progress = [self primitiveValueForKey:@"progress"];
    [self didAccessValueForKey:@"progress"];

    if (self.body.length == 0) {
        progress = @100;
    }
    else {
        progress = @(100 * [self.position intValue] / [self.wordsInBody intValue]);
    }

    return progress;
}

- (NSNumber *)wordsInBody {
    [self willAccessValueForKey:@"wordsInBody"];
    NSNumber *wordsInBody = [self primitiveValueForKey:@"wordsInBody"];
    [self didAccessValueForKey:@"wordsInBody"];

    if (!wordsInBody) {
        __block int numberOfWordsInBody = 0;
        NSRange range = {0, self.body.length};
        [self.body enumerateSubstringsInRange:range options:NSStringEnumerationByWords usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
            numberOfWordsInBody++;
        }];

        wordsInBody = @(numberOfWordsInBody);
    }

    return wordsInBody;
}

(Опять же, не уверен, что это актуально.)

Теперь в моем основном классе viewcontroller (тот, который имеет табличное представление, которое я использую NSFetchedResultsController за) Я объявил собственность и перебил ее добытчиком:

В.ч:

@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;

В м

- (NSFetchedResultsController *)fetchedResultsController {
    if (!_fetchedResultsController) {
        NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"ArticleInfo" inManagedObjectContext:context];
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        request.entity = entity;

        NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
        request.sortDescriptors = [NSArray arrayWithObject:descriptor];

        request.fetchBatchSize = 20;

        NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:@"Root"];
        _fetchedResultsController = fetchedResultsController;
        _fetchedResultsController.delegate = self;
    }

    return _fetchedResultsController;
}

Но опять же, он продолжает выдавать мне эту ошибку при запуске приложения. Что именно я делаю не так, что вызывает эту ошибку?

1 ответ

Решение

NSEntityDescription *entity = [NSEntityDescription entityForName:@"ArticleInfo" inManagedObjectContext:context]

Что-то здесь ноль. Зарегистрируйте контекст и сущность, чтобы увидеть, какая из них. Возможно, имя вашей сущности в вашей модели не "ArticleInfo" (опечатка?), Или у вашего делегата приложения есть проблема при создании контекста.

Другие вопросы по тегам