ios - NSFetchResultsController 委托(delegate)没有被调用

标签 ios core-data delegates nsfetchedresultscontroller core-data-migration

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

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

我的问题是,一旦我将数据插入到新创建的Entity中,即使没有错误,NSFetchedResultsController委托(delegate)也不会被触发插入时抛出,我验证了 SQL 表中确实发生了插入。

我已经使用检查是否需要核心数据迁移

 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工作 > 到最新的。托管对象模型中新添加的实体和旧实体之间没有任何关系。

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

- (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;

}

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

 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

任何帮助将不胜感激。

最佳答案

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

关于ios - NSFetchResultsController 委托(delegate)没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15239791/

相关文章:

ios - 将 Swipe Gesture 添加到项目中的所有 View Controller

ios - Xcode 在尝试构建以在设备上运行时卡在复制文件上

objective-c - didChangeObject : not called of NSFetchedResultsController

iphone - 使用委托(delegate)时,需要更好的方法来进行顺序处理

c# - 无法推断 C# 中的类型,必须明确设置吗?

ios - 列表中列表的 RestKit 对象映射

ios - 实时文本识别 (OCR)

ios - 核心数据简单关系-NSSet

objective-c - 将核心数据存储从 iCloud 迁移到本地

jquery - .delegate() 和 live() 有什么区别?