我使用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;
}
我在获取结果控制器中添加了一个Log后,我得到了以下结果
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
任何帮助将不胜感激。
答案 0 :(得分:2)
从我的评论中解释。您需要在FRC检测到模型更改并调用其委托方法之前调用[fecthedResultsController performFetch:&error]
。