3

我正在NSFetchedResultsController使用 coredata 加载我的 tableView。最近我在我的 ManagedObjectModel 中添加了一个新Entity的,并进行了 coredata 版本控制并使用了轻量级迁移。

我的托管对象上下文 (MOC) 的打印描述显示了新添加的架构,并且架构也在NSPersistentStoreCoordinator.

我的问题是,一旦我将数据插入到新创建Entity的文件中,即使在插入时没有引发错误,NSFetchedResultsController代表也不会被触发,并且我验证了插入确实发生在 SQL 表中。

我已经检查过是否需要使用 coredata 迁移

 NSMigrationManager *manager = [[NSMigrationManager alloc]
                               initWithSourceModel:[self sourceModel] destinationModel:[self destinationModel]];




BOOL success = [manager migrateStoreFromURL:storeURL type:NSSQLiteStoreType
                                    options:nil withMappingModel:mappingModel toDestinationURL:dstStoreURL
                            destinationType:NSSQLiteStoreType destinationOptions:nil error:outError];

发现coredata是自动选择了正确的模型,不需要使用NSMigrationManager

为了实现NSFetchResultsController,我遵循了 Raywenderlich 的示例

http://www.raywenderlich.com/999/core-data-tutorial-how-to-use-nsfetchedresultscontroller 过去它在没有任何版本控制的情况下可以在 CoreData 上正常工作。

谁能告诉我在添加新实体并进行版本控制后如何NSFetchResultsController delegate工作,我必须使用最新的。托管对象模型中新添加的实体和旧实体之间没有关系。changed the Current Core Data Model

编辑:这是我的获取结果控制器初始化代码

- (NSFetchedResultsController *)fetchedResultsController {

if (fetchedResultsController != nil) {
    return fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"SongDetails" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                          initWithKey:@"songName" ascending:YES];


[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];



[fetchRequest setFetchBatchSize:10];

/*CHECKED WHETHER ANY SONGDETAILS ARE FETCHED*/
NSError * err;
NSArray * results = [managedObjectContext executeFetchRequest:fetchRequest error:&err];
NSLog(@" results >>> %@ ,results);
/* */

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
                                               cacheName:nil];

self.fetchedResultsController = theFetchedResultsController;
fetchedResultsController.delegate = self;

return fetchedResultsController;

}

在获取结果控制器中添加日志后,我得到以下结果

 results >>> ("<SongDetails: 0x115abae0> (entity: SongDetails; id: 0x115a94a0 <x-coredata://7E5CDD40-8A4C-455D-8000-34FD70AC8837/SongDetails/p1> ; data: <fault>)",
"<SongDetails: 0x115abe90> (entity: SongDetails; id: 0x115aa450 <x-coredata://7E5CDD40-8A4C-455D-8000-34FD70AC8837/SongDetails/p2> ; data: <fault>)",

以下是插入时 SQL 调试器的结果。

2013-03-06 12:09:25.894[6035:c07] CoreData: sql: BEGIN EXCLUSIVE
2013-03-06 12:09:25.895[6035:c07] CoreData: sql: INSERT INTO ZSONGDETAILS(Z_PK, Z_ENT, Z_OPT, ZSONGNAME) VALUES(?, ?, ?, ?)
2013-03-06 12:09:25.902[6035:c07] CoreData: sql: COMMIT

任何帮助将不胜感激。

4

1 回答 1

3

从我的评论中转述。您需要[fecthedResultsController performFetch:&error]在 FRC 检测模型更改并调用其委托方法之前调用。

于 2013-03-06T06:55:33.720 回答