0

こんにちは、私の 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 は常に nil です。オブジェクトを追加する方法は次のとおりです。

-(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 ファイルが表示される場合、それは変更されていますが、オブジェクトを取得できません。本当に奇妙なことに、私は他のアプリに基本的に同じコードを使用していますが、問題なく動作します。

何か案は?

4

1 に答える 1

1

performFetchフェッチされた結果コントローラーを 1 回呼び出す必要があります。そうしないと、何もフェッチされず、変更も追跡されません。たとえば、追加

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

fetchedResultsControllerゲッターメソッドの最後。

備考:を指定しcacheNameないで指定するsectionNameKeyPathと問題が発生する可能性があるようです。 UITableView with NSFetchedResultsController Does Not Load the Second Time を参照してください。キャッシュはセクション情報をキャッシュするために使用されるため、セクションがない場合はとにかく必要ありません。

更新:前の発言はもはや有効ではありません。リンクされた質問の問題には別の原因があることが判明しました。

于 2013-02-09T20:05:15.707 に答える